在线
客服

在线客服
尊敬的客户,我们24小时竭诚为您服务 公司总机: 0755-83312037 (32条线)

客服
热线

0755-83312037 (32条线)
7*24小时客服服务热线

?

关注
微信

关注官方微信
TOP

返回
顶部

PHP教程:基于正则表达式替换的模板引擎

发布时间:2019-04-13浏览次数:967 <p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <font color="#ff0000">WebjxCom提示:</font><font color="#000000">模板引擎正则表达式调试小技巧.</font> </td> </tr></tbody></table> <p>很久没有遇上PHP难题了,这次正则问题占了一点时间,还是老问题最大回溯、递归限制问题。学习透之后其实并不难修改调试有这类问题的正则。主要是以下几点。</p> <p>基于正则表达式替换的模板引擎很容易遇上正则表达式最大回溯/递归的限制。</p> <p>惰性匹配并不可怕,正常情况下模板并不会不够用,往往不会超出限制,discuz的模板引擎就大量使用了。但是因此而不去注意、不去学习,则容易书写错误并遇上问题。</p> <p>当preg_*返回的是null的时候则要注意了,判断函数是is_null.</p> <p>出错并不可怕,但是最好把错误都完整的输出,这样调试就很容易了。</p> <p>除了输出出错原因,还要输出匹配的文本和使用的正则,这样就很容易调试了。</p> <p>PHP代码</p> <table style="BORDER-BOTTOM: #0099cc 1px solid; BORDER-LEFT: #0099cc 1px solid; TABLE-LAYOUT: fixed; BORDER-TOP: #0099cc 1px solid; BORDER-RIGHT: #0099cc 1px solid" border="0" cellspacing="0" cellpadding="6" width="95%" align="center"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#ddedfb"> <ol class="dp-c"> <li class="alt"> <span><span>&lt;?php &#160;&#160;</span></span> </li> <li> <span class="keyword">if</span><span>&#160;(</span><span class="func">is_null</span><span>(</span><span class="vars">$tmp</span><span>)){ &#160;&#160;</span> </li> <li class="alt"> <span>&#160;&#160;&#160;&#160;</span><span class="vars">$error_code</span><span>&#160;=&#160;preg_last_error(); &#160;&#160;</span> </li> <li> <span>&#160;&#160;&#160;&#160;</span><span class="keyword">switch</span><span>(</span><span class="vars">$error_code</span><span>){ &#160;&#160;</span> </li> <li class="alt"> <span>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span class="keyword">case</span><span>&#160;PREG_NO_ERROR&#160;: &#160;&#160;</span> </li> <li> <span>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span class="func">echo</span><span>&#160;</span><span class="string">'PREG_NO_ERROR'</span><span>; &#160;&#160;</span> </li> <li class="alt"> <span>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span class="keyword">break</span><span>; &#160;&#160;</span> </li> <li> <span>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span class="keyword">case</span><span>&#160;PREG_INTERNAL_ERROR: &#160;&#160;</span> </li> <li class="alt"> <span>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span class="func">echo</span><span>&#160;</span><span class="string">'PREG_INTERNAL_ERROR'</span><span>; &#160;&#160;</span> </li> <li> <span>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span class="keyword">break</span><span>; &#160;&#160;</span> </li> <li class="alt"> <span>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span class="keyword">case</span><span>&#160;PREG_BACKTRACK_LIMIT_ERROR: &#160;&#160;</span> </li> <li> <span>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span class="func">echo</span><span>&#160;</span><span class="string">'PREG_BACKTRACK_LIMIT_ERROR'</span><span>; &#160;&#160;</span> </li> <li class="alt"> <span>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span class="keyword">break</span><span>; &#160;&#160;</span> </li> <li> <span>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span class="keyword">case</span><span>&#160;PREG_RECURSION_LIMIT_ERROR: &#160;&#160;</span> </li> <li class="alt"> <span>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span class="func">echo</span><span>&#160;</span><span class="string">'PREG_RECURSION_LIMIT_ERROR'</span><span>; &#160;&#160;</span> </li> <li> <span>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span class="keyword">break</span><span>; &#160;&#160;</span> </li> <li class="alt"> <span>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span class="keyword">case</span><span>&#160;PREG_BAD_UTF8_ERROR: &#160;&#160;</span> </li> <li> <span>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span class="func">echo</span><span>&#160;</span><span class="string">'PREG_BAD_UTF8_ERROR'</span><span>; &#160;&#160;</span> </li> <li class="alt"> <span>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span class="keyword">break</span><span>; &#160;&#160;</span> </li> <li> <span>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span class="keyword">case</span><span>&#160;PREG_BAD_UTF8_OFFSET_ERROR: &#160;&#160;</span> </li> <li class="alt"> <span>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span class="func">echo</span><span>&#160;</span><span class="string">'PREG_BAD_UTF8_OFFSET_ERROR'</span><span>; &#160;&#160;</span> </li> <li> <span>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span class="keyword">break</span><span>; &#160;&#160;</span> </li> <li class="alt"> <span>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span class="keyword">default</span><span>: &#160;&#160;</span> </li> <li> <span>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span class="func">echo</span><span>&#160;</span><span class="string">'UNKNOW&#160;ERROR'</span><span>; &#160;&#160;</span> </li> <li class="alt"> <span>&#160;&#160;&#160;&#160;} &#160;&#160;</span> </li> <li> <span>&#160;&#160;&#160;&#160;</span><span class="func">exit</span><span>; &#160;&#160;</span> </li> <li class="alt"> <span>}&#160;&#160;</span> </li> </ol> </td> </tr></tbody></table> <p><strong>参考资料</strong></p> <p>1、2010, Laruence <a href="http://www.laruence.com/2010/06/08/1579.html" target="_blank"><font color="#0000ff">《深悉正则(pcre)最大回溯/递归限制》</font></a></p> <p>2、2011, PHP中文手册<a href="http://us2.php.net/manual/zh/function.preg-last-error.php" target="_blank"><font color="#0000ff"> preg_last_error</font></a></p>