模板引擎正則表達式調(diào)試小技巧
更新時間:2011年07月20日 22:57:14 作者:
很久沒有遇上PHP難題了,這次正則問題占了一點時間,還是老問題最大回溯、遞歸限制問題。學習透之后其實并不難修改調(diào)試有這類問題的正則。主要是以下幾點。
基于正則表達式替換的模板引擎很容易遇上正則表達式最大回溯/遞歸的限制。
惰性匹配并不可怕,正常情況下模板并不會不夠用,往往不會超出限制,discuz的模板引擎就大量使用了。但是因此而不去注意、不去學習,則容易書寫錯誤并遇上問題。
當preg_*返回的是null的時候則要注意了,判斷函數(shù)是is_null.
出錯并不可怕,但是最好把錯誤都完整的輸出,這樣調(diào)試就很容易了。
除了輸出出錯原因,還要輸出匹配的文本和使用的正則,這樣就很容易調(diào)試了。
PHP代碼
<?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;
}
惰性匹配并不可怕,正常情況下模板并不會不夠用,往往不會超出限制,discuz的模板引擎就大量使用了。但是因此而不去注意、不去學習,則容易書寫錯誤并遇上問題。
當preg_*返回的是null的時候則要注意了,判斷函數(shù)是is_null.
出錯并不可怕,但是最好把錯誤都完整的輸出,這樣調(diào)試就很容易了。
除了輸出出錯原因,還要輸出匹配的文本和使用的正則,這樣就很容易調(diào)試了。
PHP代碼
復制代碼 代碼如下:
<?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
相關文章
php 使用file_get_contents讀取大文件的方法
本文介紹了在php中使用file_get_contents函數(shù)讀取大文件的方法,并附上了示例以及使用小技巧,非常的實用,這里推薦給大家2014-11-11PHP 向右側(cè)拉菜單實現(xiàn)代碼,測試使用中
PHP 向右側(cè)拉菜單實現(xiàn)代碼,測試使用中,需要的朋友可以測試下。2009-11-11golang、python、php、c++、c、java、Nodejs性能對比
這篇文章主要介紹了golang、python、php、c++、c、java、Nodejs性能對比的相關資料,需要的朋友可以參考下2017-03-03PHP結(jié)合Redis+MySQL實現(xiàn)冷熱數(shù)據(jù)交換應用案例詳解
這篇文章主要介紹了PHP結(jié)合Redis+MySQL實現(xiàn)冷熱數(shù)據(jù)交換應用案例,結(jié)合具體實例形式詳細分析了Redis+MySQL冷熱數(shù)據(jù)交換原理、實現(xiàn)方法及相關操作技巧,需要的朋友可以參考下2019-07-07