我目前有这个正则表达式
/^(@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
我该如何解决?
答案 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在这里不是正确的工具。