Chinaunix首页 | 论坛 | 博客
  • 博客访问: 213504
  • 博文数量: 42
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 420
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-09 10:55
个人简介

每天改变一点点,生活充满了惊喜。

文章分类

全部博文(42)

文章存档

2016年(8)

2015年(29)

2014年(5)

我的朋友

分类: PHP

2016-02-03 11:56:45

最近碰到一个问题,需要校验一个字符串是否是有效的正则表达式。
一开始想到用正则去校验,但正则表达式的复杂度太高,很难做到精确的匹配。
另外一个就是,写一个正则表达式的解析引擎,复杂度更高,而且确实不是我当前能力所能及的。
那何不借助脚本语言解释器中已有的正则表达式解析引擎来实现,那如果用 PHP 语言来快速实现这个需求呢?

可以借助 PHP 的track_errors来实现,track_errors是PHP的一个配置项,
如果
打开,PHP 运行过程中产生的最后一个错误信息,始终被保存在全局变量 php_errormsg 中。

  1.     /**
  2.      * 正则表达式字符串有效性校验
  3.      * @param string $pattern 待校验正则表达式
  4.      * @return ture | false
  5.      */
  6.     public function checkPregPattern($pattern){
  7.         //打开 track_errors,如果已打开,保存$php_errormsg全局变量状态
  8.         if ($oldTrack = ini_get("track_errors")){
  9.             $oldMessage = isset($php_errormsg) ? $php_errormsg : false;
  10.         } else {
  11.             ini_set('track_errors', 1);
  12.         }
  13.         //删除$php_errormsg变量
  14.         unset($php_errormsg);
  15.         //尝试执行 preg_match
  16.         @preg_match($pattern, "");
  17.         //通过$php_errormsg是否被设置来判断执行是否出错,从而判断正则字符串是否有效
  18.         $ret = isset($php_errormsg) ? false : true;
  19.         //恢复 track_errors 以及 $php_errormsg
  20.         if ($oldTrack){
  21.             $php_errormsg = isset($oldMessage) ? $oldMessage : false;
  22.         } else {
  23.             unset($php_errormsg);
  24.             ini_set('track_errors', 0);
  25.         }
  26.         return $ret;
  27.     }


参考:
《精通正则表达式》
阅读(2005) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~