匹配括号之间的所有内容

时间:2014-05-17 10:48:39

标签: php regex

我目前有这个正则表达式

/^(@if([a-zA-z0-9.=(\s*)]+))/

我希望匹配@if (expression)行中的任何字符串,其中包含以下字符串:

@if (name == false)
@if (1 == 1)
@if ((name == false) && 1 == 1)
@if (model.name)
@if (model|length > 5)

然而我现在的正则表达式也接受这些字符串:

@if (1 == 1)s

我该如何解决?

2 个答案:

答案 0 :(得分:1)

由于您在此处理嵌套括号,因此需要使用recursive regex feature of PCRE regex

$s = '@if ((name == false) && 1 == 1)';
if (preg_match('/(@if) \s* ( \( (?: [^()]* | (?2) )* \) ) \s*$ /x', $s, $arr))
   print_r($arr);

<强>输出

Array
(
    [0] => @if ((name == false) && 1 == 1)
    [1] => @if
    [2] => ((name == false) && 1 == 1)
)

PS:由于诉讼\s*$最终与@if ((name == false) && 1 == 1)foo不匹配

答案 1 :(得分:0)

不幸的是,其他答案被删除了。它将^@if\s?\(.*\)$作为正则表达式,最终将解决您与其他字符的问题。

但是,我建议你重新考虑一下你的做法。您正在经历正则表达式的固有限制。您无法计算打开括号与封闭括号的数量。因此,任何正则表达式也会验证@if ()))This question有更多详情。

正则表达式有一些extensions允许递归,但我会避免使用它。 Regexps在这里不是正确的工具。