我有以下正则表达式匹配{{statement}}。
#{{(.*?)}}#
我在preg_replace_callback中使用它。它工作正常,但问题是,如果在同一块中有另一个块则会中断。 以下示例将打破
{{$a="{{name}}"}}
最高匹配{{$a="{{name}}
,但我希望它与{{$a="{{name}}"}}
匹配。
如果可能,我可以使用这样的逃脱角色。
{{$a="\{{name}}"}}
在这种情况下,以#开头的块将被转义。
答案 0 :(得分:1)
根据输入数据的不同,您可以说明模式应该以{{1}}开头,并以{{
结尾?
使用}}
作为模式yields the following result:
#^{{(.*?)}}$#
好的,switching out the regex到{{$a="string"}} --> $a="string"
{{$b="{{complex}}"}} --> $b="{{complex}}"
现在产生了:
^({{(?:.*?)}})$
答案 1 :(得分:1)
您使用{{(.*?)}}
正在做的是要求正则表达式匹配懒惰。
*?
量词在零和无限时间之间进行匹配,尽可能少,根据需要进行扩展(延迟搜索)。
您应该使用{{(.*)}}
。
*
尽可能多次,根据需要回馈(贪婪)
<强> Regex101 Demo 强>
答案 2 :(得分:0)
如评论中所述,您可能正在寻找递归方法:
\{ # match {
(?:[^{}]*|(?R))+ # match not {} or repeat the pattern
\} # match }