除了模式之外的一切

时间:2015-04-11 16:40:22

标签: php regex pcre

我希望捕捉2对大括号{{ ... }}之间的所有内容。

我已经拥有的是这个

/{{([^{}]+)}}/i
here with some spaces, for better reading:
/  {{  [^{}]+  }}  /i 

但这显然不会让我做{{ function(){ echo 1234; }; }}

之类的事情

所以我的问题是:如何排除模式而不是列表?

2 个答案:

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

如果括号不平衡,这里使用占有量词来防止大量回溯。

这种方式的优点是它适用于任何嵌套括号的级别,请参见示例:

demo