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


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入门学习知识点七 PHP函数的基本应用
Jul 14 PHP
PHP mail()函数使用及配置方法
Jan 14 PHP
php统计文章排行示例
Mar 04 PHP
Discuz批量替换帖子内容的方法(使用SQL更新数据库)
Jun 23 PHP
ThinkPHP3.2.3数据库设置新特性
Mar 05 PHP
PHP使用flock实现文件加锁的方法
Jul 01 PHP
php实现的Curl封装类Curl.class.php用法实例分析
Sep 25 PHP
PHP 读取文本文件内容并分页显示
Jan 02 PHP
PHP实现补齐关闭的HTML标签
Mar 22 PHP
什么是OneThink oneThink后台添加插件步骤
Apr 13 PHP
PHP实现简单ajax Loading加载功能示例
Dec 28 PHP
基于php数组中的索引数组和关联数组详解
Mar 12 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面向对象全攻略 (十六) 对象的串行化
2009/09/30 PHP
Ext.data.PagingMemoryProxy分页一次性读取数据的实现代码
2010/04/07 PHP
PHP递归返回值时出现的问题解决办法
2013/02/19 PHP
PHP中使用php://input处理相同name值的表单数据
2015/02/03 PHP
PHP编译安装时常见错误解决办法
2015/05/28 PHP
PHP实现的简单对称加密与解密方法实例小结
2017/08/28 PHP
Thinkphp自定义生成缩略图尺寸的方法
2019/08/05 PHP
js 发个判断字符串是否为符合标准的函数
2009/04/27 Javascript
javascript 去字符串空格终极版(支持utf8)
2009/11/14 Javascript
Javascript实现颜色rgb与16进制转换的方法
2015/04/18 Javascript
基于jQuery实现响应式圆形图片轮播特效
2015/11/25 Javascript
基于MVC5和Bootstrap的jQuery TreeView树形控件(一)之数据支持json字符串、list集合
2016/08/11 Javascript
概述如何实现一个简单的浏览器端js模块加载器
2016/12/07 Javascript
AngularJs 利用百度地图API 定位当前位置 获取地址信息
2017/01/18 Javascript
解决webpack打包速度慢的解决办法汇总
2017/07/06 Javascript
vuejs使用递归组件实现树形目录的方法
2017/09/30 Javascript
Vue.js2.0中的变化小结
2017/10/24 Javascript
Vue拖拽组件列表实现动态页面配置功能
2019/06/17 Javascript
node.js使用net模块创建服务器和客户端示例【基于TCP协议】
2020/02/14 Javascript
手把手教你实现 Promise的使用方法
2020/09/02 Javascript
[50:50]完美世界DOTA2联赛PWL S3 Galaxy Racer vs Phoenix 第一场 12.10
2020/12/13 DOTA
在Python的Flask框架中实现单元测试的教程
2015/04/20 Python
Django自定义认证方式用法示例
2017/06/23 Python
Python面向对象程序设计示例小结
2019/01/30 Python
python cv2截取不规则区域图片实例
2019/12/21 Python
python不同版本的_new_不同点总结
2020/12/09 Python
Python 内存管理机制全面分析
2021/01/16 Python
新秀丽拉杆箱美国官方网站:Samsonite美国
2016/07/25 全球购物
StubHub新加坡:购买和出售全球活动门票
2017/03/10 全球购物
世界上最大的艺术社区:SAA
2020/12/30 全球购物
如何查找和删除数据库中的重复数据
2014/11/05 面试题
工作表现评语
2014/01/19 职场文书
2014年音乐教师工作总结
2014/12/03 职场文书
土地租赁协议书
2015/01/29 职场文书
鉴史问廉观后感
2015/06/10 职场文书
如何撰写出一份完美的商业计划书?
2019/07/12 职场文书