Preg match {{statement}}表达式

时间:2017-05-01 12:56:14

标签: php regex

我有以下正则表达式匹配{{statement}}。

#{{(.*?)}}#

我在preg_replace_callback中使用它。它工作正常,但问题是,如果在同一块中有另一个块则会中断。 以下示例将打破

{{$a="{{name}}"}}

最高匹配{{$a="{{name}},但我希望它与{{$a="{{name}}"}}匹配。

如果可能,我可以使用这样的逃脱角色。

{{$a="\{{name}}"}}

在这种情况下,以#开头的块将被转义。

3 个答案:

答案 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 }

请参阅a demo on regex101.com