复杂的正则表达式。部分匹配字符串未选中

时间:2014-03-26 15:42:01

标签: php regex

当前REGEX:

\(\_IF\_\(\%([a-zA-Z0-9_]+)\=([a-zA-Z0-9_]+)\)\{\s+(.*?)\s+(\}\)+)

当前输入:

<div class="right-side w-37">
    (_IF_(%verified=1){
        (_IF_(%post_on_profile=1){
            what is going on!!
        })
    })
</div>

看看这个演示:http://regex101.com/r/fN2kG5/#debugger

启动调试器(如果尚未启动),单击绿线表示&#34;匹配1 - ....&#34;并且到底部

您将看到在代码的最后,字符})与匹配分开。我不知道我做错了什么,但我在匹配字符串中需要它们。可能会出现多次&#39;})&#39;,例如&#39;})})&#39;。所以我需要在匹配字符串中添加所有这些内容。

但是怎么样?

谢谢! :)

2 个答案:

答案 0 :(得分:1)

从正则表达式的末尾删除此(\}\)+)并替换为下面的一个:

(\}\)\s*)+

这里放置一个可选的空格\s*,然后用+重复。

答案 1 :(得分:0)

您可以在此处使用递归来获取所有结束})(如果有):

\(\_IF\_\(\%([a-zA-Z0-9_]+)\=([a-zA-Z0-9_]+)\)\{(?:((?R))|[^{}])+\}\)

regex101 demo

不幸的是,单独使用regex无法获得所有变量/值对。但是,您可以在函数中使用上述正则表达式,并在递归中传递第三个捕获的组,直到您不再拥有第三个捕获的组。这样,您将获得所有变量/值对。