欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

为什么这段正则表达式一执行就失败??

程序员文章站 2022-05-02 08:56:11
...
本帖最后由 u010024302 于 2013-08-13 15:48:31 编辑

正则表达式 PHP 正则 标签 语法分析

很奇怪的问题,一个PHP的正则规则,匹配有些字串很正常,但匹配另外一段字串就直接无法返回,HTTP请求状态为Abort。
代码如下:
$patterns = '/\{(Cms:navlist)(\s[^\}]*|)\}((?:(?!\{\/?\1(?:\s[^\}]*|)\})[\s\S]|(?R))*)\{\/\1\}/';preg_match_all($patterns,$str,$res);var_dump($res);


无法匹配的字串为下:
$str = '{Cms:navlist }	
{Cms:navlist pid="$navlist[\'id\']" item="navlist1" key=\'key1\' elem=\'ul\' addition=\'class="111"\'}
  • {$navlicst1.title}
  • {/Cms:navlist}{/Cms:navlist}';

    但很奇怪的是,如果把上面的字符串更改一点点地方,比如把
    "{if condition=$a.first == true}"
    改成
    "{if condition=a == true}"
    或者改动其他几个地方就能执行成功~
    出错的时候PHP也不提示错误出在哪里~郁闷死我了
    求高人指点迷津~谢谢了

    回复讨论(解决方案)

    内存溢出
    不是语法错,php怎么报呢?

    内存溢出
    不是语法错,php怎么报呢?


    为什么会内存溢出呢?我改如何做?

    为什么会内存溢出呢?
    不知道,测试时表现出的现象就是“内存溢”
    应该是 perl 扩展中的问题,预留的堆栈太小了

    你这是在做模板引擎吧
    解析模板可没有这么费事,分别析出模板元素就可以了

    就算你这样能识别出两重嵌套的标记,但若是三重、四重呢?
    再说你这样得到的结果,处理起来也是的问题

    为什么会内存溢出呢?
    不知道,测试时表现出的现象就是“内存溢”
    应该是 perl 扩展中的问题,预留的堆栈太小了

    你这是在做模板引擎吧
    解析模板可没有这么费事,分别析出模板元素就可以了

    就算你这样能识别出两重嵌套的标记,但若是三重、四重呢?
    再说你这样得到的结果,处理起来也是的问题

    我最多嵌套三层~另外php的正则引擎里面不支持堆栈平衡组语法,其实直接写个语法解析类最好了,但问题是php字符串操作没有指针支持,我又必须在字符串里进行操作~如果用其他函数写的话性能损失很大~
    真纠结了………………

    另外引擎不是我写的,是thinkphp框架自带的引擎,但他天生不支持模板标签配对的操作,现在我须要扩展模板标签库实现我自己的功能就会出问题,在三层标签嵌套的时候他会把最里层的关断标签拿来匹配最外层的标签~
    真是纠结啊~