很久沒有遇上PHP難題了,這次正規問題占了一點時間,還是老問題最大回溯、遞歸限制問題。學習透之後其實並不難修改偵錯有這類問題的正規。主要是以下幾點。

基於正規表達式替換的模板引擎很容易遇上正規表達式最大回溯/遞歸的限制。

惰性匹配並不可怕,正常情況下模板並不會不夠用,往往不會超出限制,discuz的模板引擎就大量使用了。但是因此而不去註意、不去學習,則容易書寫錯誤並遇上問題。

當preg_*返回的是null的時候則要註意了,判斷函數是is_null.

出錯並不可怕,但是最好把錯誤都完整的輸出,這樣偵錯就很容易了。

除了輸出出錯原因,還要輸出匹配的文本和使用的正規,這樣就很容易偵錯了。

PHP代碼

1.<?php   
2.if (is_null($tmp)){   
3.    $error_code = preg_last_error();   
4.    switch($error_code){   
5.        case PREG_NO_ERROR :   
6.            echo 'PREG_NO_ERROR';   
7.            break;   
8.        case PREG_INTERNAL_ERROR:   
9.            echo 'PREG_INTERNAL_ERROR';   
10.            break;   
11.        case PREG_BACKTRACK_LIMIT_ERROR:   
12.            echo 'PREG_BACKTRACK_LIMIT_ERROR';   
13.            break;   
14.        case PREG_RECURSION_LIMIT_ERROR:   
15.            echo 'PREG_RECURSION_LIMIT_ERROR';   
16.            break;   
17.        case PREG_BAD_UTF8_ERROR:   
18.            echo 'PREG_BAD_UTF8_ERROR';   
19.            break;   
20.        case PREG_BAD_UTF8_OFFSET_ERROR:   
21.            echo 'PREG_BAD_UTF8_OFFSET_ERROR';   
22.            break;   
23.        default:   
24.            echo 'UNKNOW ERROR';   
25.    }   
26.    exit;   
27.}   
 

創作者介紹
創作者 夢想工程 的頭像
Robin

夢想工程

Robin 發表在 痞客邦 留言(0) 人氣( 4 )