基於Regex替換的模板引擎很容易遇上Regex最大回溯/遞迴的限制。
惰性匹配並不可怕,正常情況下模板並不會不夠用,往往不會超出限制,discuz的模板引擎就大量使用了。但是因此而不去注意、不去學習,則容易書寫錯誤並遇上問題。
當preg_*返回的是null的時候則要注意了,判斷函數是is_null.
出錯並不可怕,但是最好把錯誤都完整的輸出,這樣調試就很容易了。
除了輸出出錯原因,還要輸出匹配的文本和使用的正則,這樣就很容易調試了。
PHP代碼
複製代碼 代碼如下:
if (is_null($tmp)){
$error_code = preg_last_error();
switch($error_code){
case PREG_NO_ERROR :
echo 'PREG_NO_ERROR';
break;
case PREG_INTERNAL_ERROR:
echo 'PREG_INTERNAL_ERROR';
break;
case PREG_BACKTRACK_LIMIT_ERROR:
echo 'PREG_BACKTRACK_LIMIT_ERROR';
break;
case PREG_RECURSION_LIMIT_ERROR:
echo 'PREG_RECURSION_LIMIT_ERROR';
break;
case PREG_BAD_UTF8_ERROR:
echo 'PREG_BAD_UTF8_ERROR';
break;
case PREG_BAD_UTF8_OFFSET_ERROR:
echo 'PREG_BAD_UTF8_OFFSET_ERROR';
break;
default:
echo 'UNKNOW ERROR';
}
exit;
}
參考資料
1、2010, Laruence 《深悉正則(pcre)最大回溯/遞迴限制》
2、2011, PHP中文手冊 preg_last_error
http://www.bkjia.com/PHPjc/323933.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/323933.htmlTechArticle基於Regex替換的模板引擎很容易遇上Regex最大回溯/遞迴的限制。 惰性匹配並不可怕,正常情況下模板並不會不夠用,往往不會...