模板引擎正则表达式调试小技巧


Posted in PHP onJuly 20, 2011

基于正则表达式替换的模板引擎很容易遇上正则表达式最大回溯/递归的限制。
惰性匹配并不可怕,正常情况下模板并不会不够用,往往不会超出限制,discuz的模板引擎就大量使用了。但是因此而不去注意、不去学习,则容易书写错误并遇上问题。
当preg_*返回的是null的时候则要注意了,判断函数是is_null.
出错并不可怕,但是最好把错误都完整的输出,这样调试就很容易了。
除了输出出错原因,还要输出匹配的文本和使用的正则,这样就很容易调试了。
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 相关文章推荐
PHP安装全攻略:APACHE
Oct 09 PHP
PHPMyadmin 配置文件详解(配置)
Dec 03 PHP
php计算十二星座的函数代码
Aug 21 PHP
实现PHP多线程异步请求的3种方法
Jan 17 PHP
3种php生成唯一id的方法
Nov 23 PHP
Laravel Memcached缓存驱动的配置与应用方法分析
Oct 08 PHP
PHP实现留言板功能的详细代码
Mar 25 PHP
PHP 7.0新增加的特性介绍
Jun 08 PHP
PHP将英文数字转换为阿拉伯数字实例讲解
Jan 28 PHP
php新建文件的方法实例
Sep 26 PHP
PHP实现数组根据某个字段进行水平合并,横向合并案例分析
Oct 08 PHP
laravel框架学习笔记之组件化开发实现方法
Feb 01 PHP
php中批量替换文件名的实现代码
Jul 20 #PHP
关于php连接mssql:pdo odbc sql server
Jul 20 #PHP
PHP mcrypt可逆加密算法分析
Jul 19 #PHP
PHP中date()日期函数有关参数整理
Jul 19 #PHP
php URL验证正则表达式
Jul 19 #PHP
PHP中static关键字原理的学习研究分析
Jul 18 #PHP
在WAMP环境下搭建ZendDebugger php调试工具的方法
Jul 18 #PHP
You might like
php文件操作实例代码
2012/05/10 PHP
php递归遍历删除文件的方法
2015/04/17 PHP
thinkPHP中多维数组的遍历方法
2016/01/09 PHP
thinkphp5.0自定义验证规则使用方法
2017/11/16 PHP
Nigma vs Liquid BO3 第二场2.13
2021/03/10 DOTA
提高代码性能技巧谈—以创建千行表格为例
2006/07/01 Javascript
一次失败的jQuery优化尝试小结
2011/02/06 Javascript
javaScript NameSpace 简单说明介绍
2013/07/18 Javascript
jquery.post用法示例代码
2014/01/03 Javascript
JS创建自定义表格具体实现
2014/02/11 Javascript
javascript事件冒泡详解和捕获、阻止方法
2014/04/12 Javascript
js+csss实现的一个带复选框的下拉框
2014/09/29 Javascript
js实现动画特效的文字链接鼠标悬停提示的方法
2015/03/02 Javascript
浅析JavaScript动画
2015/06/10 Javascript
高性能JavaScript 重排与重绘(2)
2015/08/11 Javascript
AngularJS打开页面隐藏显示表达式用法示例
2016/12/25 Javascript
浅谈angularjs $http提交数据探索
2017/01/20 Javascript
jquery 实现复选框的全选操作实例代码
2017/01/24 Javascript
JS对象是否拥有某属性如何判断
2017/02/03 Javascript
canvas的神奇用法
2017/02/03 Javascript
vue-cli 组件的导入与使用教程详解
2018/04/11 Javascript
Angular(5.2-&gt;6.1)升级小结
2018/12/27 Javascript
python开发简易版在线音乐播放器
2017/03/03 Python
Python实现的计算器功能示例
2018/04/26 Python
python将四元数变换为旋转矩阵的实例
2019/12/04 Python
地理科学专业毕业生求职信
2013/10/15 职场文书
大学生学习新党章思想汇报
2014/10/25 职场文书
2015年大学元旦晚会活动策划书
2014/12/09 职场文书
员工升职自荐信
2015/03/27 职场文书
2015年优质护理服务工作总结
2015/04/08 职场文书
职工宿舍管理制度
2015/08/05 职场文书
2016年党员学习廉政准则心得体会
2016/01/20 职场文书
2016大学生求职自荐信范文
2016/01/28 职场文书
Nginx使用X-Accel-Redirect实现静态文件下载的统计、鉴权、防盗链、限速等
2021/04/04 Servers
《辉夜大小姐想让我告白》第三季正式预告
2022/03/20 日漫
Golang gRPC HTTP协议转换示例
2022/06/16 Golang