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


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 相关文章推荐
从Web查询数据库之PHP与MySQL篇
Sep 25 PHP
php select,radio和checkbox默认选择的实现方法
May 15 PHP
PHP中开发XML应用程序之基础篇 添加节点 删除节点 查询节点 查询节
Jul 09 PHP
PHP随机数生成代码与使用实例分析
Apr 08 PHP
PHP中获取文件扩展名的N种方法小结
Feb 27 PHP
php单例模式实现(对象只被创建一次)
Dec 05 PHP
100多行PHP代码实现socks5代理服务器[2]
May 05 PHP
PHP树-不需要递归的实现方法
Jun 21 PHP
在Laravel5.6中使用Swoole的协程数据库查询
Jun 15 PHP
PHP实现的函数重载功能示例
Aug 03 PHP
ThinkPHP5 的简单搭建和使用详解
Nov 15 PHP
PHP安全之register_globals的on和off的区别
Jul 23 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将数据导入到Foxmail
2006/10/09 PHP
php内核解析:PHP中的哈希表
2014/01/30 PHP
如何实现JS函数的重载
2006/09/22 Javascript
input按钮的事件处理大全
2010/12/10 Javascript
jQuery事件之键盘事件(ctrl+Enter回车键提交表单等)
2014/05/11 Javascript
JavaScript实现强制重定向至HTTPS页面
2015/06/10 Javascript
jquery实现弹出层登录和全屏层注册特效
2015/08/28 Javascript
浅谈window.onbeforeunload() 事件调用ajax
2016/06/29 Javascript
javascript中Date对象应用之简易日历实现
2016/07/12 Javascript
jQuery 全选 全部选 反选 实现代码
2016/08/17 Javascript
js获取当前时间(昨天、今天、明天)
2016/11/23 Javascript
nodejs利用http模块实现银行卡所属银行查询和骚扰电话验证示例
2016/12/30 NodeJs
JavaScript简单计算人的年龄示例
2017/04/15 Javascript
Vue 实现拖动滑块验证功能(只有css+js没有后台验证步骤)
2018/08/24 Javascript
JS 设计模式之:单例模式定义与实现方法浅析
2020/05/06 Javascript
JavaScript交换变量的常用方法小结【4种方法】
2020/05/07 Javascript
用vite搭建vue3应用的实现方法
2021/02/22 Vue.js
[01:32]DOTA2 2015国际邀请赛中国区预选赛第四日战报
2015/05/29 DOTA
python实现读取命令行参数的方法
2015/05/22 Python
详解使用python crontab设置linux定时任务
2016/12/08 Python
pyqt5简介及安装方法介绍
2018/01/31 Python
tensorflow构建BP神经网络的方法
2018/03/12 Python
浅谈Pandas 排序之后索引的问题
2018/06/07 Python
在Python中分别打印列表中的每一个元素方法
2018/11/07 Python
python实现BP神经网络回归预测模型
2019/08/09 Python
基于python计算滚动方差(标准差)talib和pd.rolling函数差异详解
2020/06/08 Python
python学习之使用Matplotlib画实时的动态折线图的示例代码
2021/02/25 Python
英国家电直销:Appliances Direct
2016/09/22 全球购物
VICHY薇姿美国官方网站:欧洲药房第一的抗衰老品牌
2017/11/22 全球购物
泰坦健身器材:Titan Fitness
2018/02/13 全球购物
size?爱尔兰官方网站:英国伦敦的球鞋精品店
2019/03/31 全球购物
岗位职责的定义
2013/11/10 职场文书
毕业生就业自荐书
2013/12/15 职场文书
教师研修随笔感言
2015/11/18 职场文书
医德医风学习心得体会
2016/01/25 职场文书
Python中的套接字编程是什么?
2021/06/21 Python