我希望捕捉2对大括号{{ ... }}
之间的所有内容。
我已经拥有的是这个
/{{([^{}]+)}}/i
here with some spaces, for better reading:
/ {{ [^{}]+ }} /i
但这显然不会让我做{{ function(){ echo 1234; }; }}
所以我的问题是:如何排除模式而不是列表?
答案 0 :(得分:2)
这是正则表达式。
\{{2}(.*?)\}{2}
\
正在逃避第一个卷曲,因为你想要找到实际的角色。下一个打开和关闭的卷曲告诉它要找到多少个前一个字符。这个时期意味着任何角色。与星号和问号配对意味着找到所有内容直到接下来的2个花括号(2因为{2}再次)。有问题吗?
答案 1 :(得分:0)
您需要构建一个与平衡大括号匹配的递归子模式。
({[^{}]*+(?:(?1)[^{}]*)*})
所以要将它整合到你的整个模式中:
{({([^{}]*+(?:(?1)[^{}]*)*+)})}
现在您要查找的内容位于捕获组2
中子模式详细信息:
( # open the capture group 1
{ # literal {
[^{}]*+ # all that is not a curly bracket (possessive quantifier)
(?: # non capturing group
(?1) # recursion: `(?1)` stands for the subpattern
# inside the capture group 1 (so the current subpattern)
[^{}]* #
)*+ # repeat as needed the non capturing group
} # literal }
) # close the capture group 1
如果括号不平衡,这里使用占有量词来防止大量回溯。
这种方式的优点是它适用于任何嵌套括号的级别,请参见示例: