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><?php   </span></span> </li>
<li>
<span class="keyword">if</span><span> (</span><span class="func">is_null</span><span>(</span><span class="vars">$tmp</span><span>)){   </span> </li>
<li class="alt">
<span>    </span><span class="vars">$error_code</span><span> = preg_last_error();   </span> </li>
<li>
<span>    </span><span class="keyword">switch</span><span>(</span><span class="vars">$error_code</span><span>){   </span> </li>
<li class="alt">
<span>        </span><span class="keyword">case</span><span> PREG_NO_ERROR :   </span> </li>
<li>
<span>            </span><span class="func">echo</span><span> </span><span class="string">'PREG_NO_ERROR'</span><span>;   </span> </li>
<li class="alt">
<span>            </span><span class="keyword">break</span><span>;   </span> </li>
<li>
<span>        </span><span class="keyword">case</span><span> PREG_INTERNAL_ERROR:   </span> </li>
<li class="alt">
<span>            </span><span class="func">echo</span><span> </span><span class="string">'PREG_INTERNAL_ERROR'</span><span>;   </span> </li>
<li>
<span>            </span><span class="keyword">break</span><span>;   </span> </li>
<li class="alt">
<span>        </span><span class="keyword">case</span><span> PREG_BACKTRACK_LIMIT_ERROR:   </span> </li>
<li>
<span>            </span><span class="func">echo</span><span> </span><span class="string">'PREG_BACKTRACK_LIMIT_ERROR'</span><span>;   </span> </li>
<li class="alt">
<span>            </span><span class="keyword">break</span><span>;   </span> </li>
<li>
<span>        </span><span class="keyword">case</span><span> PREG_RECURSION_LIMIT_ERROR:   </span> </li>
<li class="alt">
<span>            </span><span class="func">echo</span><span> </span><span class="string">'PREG_RECURSION_LIMIT_ERROR'</span><span>;   </span> </li>
<li>
<span>            </span><span class="keyword">break</span><span>;   </span> </li>
<li class="alt">
<span>        </span><span class="keyword">case</span><span> PREG_BAD_UTF8_ERROR:   </span> </li>
<li>
<span>            </span><span class="func">echo</span><span> </span><span class="string">'PREG_BAD_UTF8_ERROR'</span><span>;   </span> </li>
<li class="alt">
<span>            </span><span class="keyword">break</span><span>;   </span> </li>
<li>
<span>        </span><span class="keyword">case</span><span> PREG_BAD_UTF8_OFFSET_ERROR:   </span> </li>
<li class="alt">
<span>            </span><span class="func">echo</span><span> </span><span class="string">'PREG_BAD_UTF8_OFFSET_ERROR'</span><span>;   </span> </li>
<li>
<span>            </span><span class="keyword">break</span><span>;   </span> </li>
<li class="alt">
<span>        </span><span class="keyword">default</span><span>:   </span> </li>
<li>
<span>            </span><span class="func">echo</span><span> </span><span class="string">'UNKNOW ERROR'</span><span>;   </span> </li>
<li class="alt">
<span>    }   </span> </li>
<li>
<span>    </span><span class="func">exit</span><span>;   </span> </li>
<li class="alt">
<span>}  </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>