程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 模板引擎正則表達式調試小技巧

模板引擎正則表達式調試小技巧

編輯:關於PHP編程

    很久沒有遇上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. }  

    參考資料

    1、2010, Laruence 《深悉正則(pcre)最大回溯/遞歸限制》

    2、2011, PHP中文手冊 preg_last_error

    (來源:微風實驗室

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved