ahm*_*007 2 php regex backreference preg-match-all
我想知道这里的反向引用有什么问题:
preg_match_all('/__\((\'|")([^\1]+)\1/', "__('match this') . 'not this'", $matches);
Run Code Online (Sandbox Code Playgroud)
它应该匹配__('')之间的字符串,但实际上它返回:
match this') . 'not this
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
您不能在字符类中使用反向引用,因为字符类只匹配一个字符,反向引用可能匹配任意数量的字符,或者没有.
你要做的事情需要一个负面的前瞻,而不是一个否定的角色类:
preg_match_all('/__\(([\'"])(?:(?!\1).)+\1\)/',
"__('match this') . 'not this'", $matches);
Run Code Online (Sandbox Code Playgroud)
我也改变了你的交替 - \'|"- 一个字符类 - [\'"]- 因为它更有效率,我逃脱了外括号,使它们与字面括号匹配.
编辑:我想我需要扩展"更有效"的评论.我接过例如弗里德尔用来证明这一点,并在使用RegexBuddy测试它.
应用于目标文本abababdedfg,
^[a-g]+$经过三个步骤报告成功,同时执行
^(?:a|b|c|d|e|f|g)+$55个步骤.
这是一场成功的比赛.当我尝试它时abababdedfz,
^[a-g]+$报告失败21步;
^(?:a|b|c|d|e|f|g)+$需要99步.
在这种特殊情况下,对性能的影响是微不足道的,甚至不值得一提.我只是说,每当你发现自己在一个字符类和一个两个都匹配相同的事物的选择之间做出选择时,你几乎总是应该选择角色类.只是一个经验法则.
| 归档时间: |
|
| 查看次数: |
2757 次 |
| 最近记录: |