Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在括号中匹配所有内容_Php_Regex - Fatal编程技术网

Php 在括号中匹配所有内容

Php 在括号中匹配所有内容,php,regex,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 我该如何修复它?不幸的是

我现在有这个正则表达式

/^(@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

我该如何修复它?

不幸的是,另一个答案被删除了。它将
^@if\s?\(.\)$
作为regexp,这将解决您在结尾处使用其他字符的问题

然而,我建议你重新考虑你的方法。您正在经历正则表达式的固有限制。您无法计算开括号和闭括号的数量。因此,任何regexp都将验证
@if())
。有更多的细节


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

因为这里处理的是嵌套括号,所以需要使用

输出

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

PS:由于sue
\s*$
的原因,如果((name==false)和&1==1)foo

计算括号或递归与问题中的问题有什么关系?从技术上讲,你是对的。这样,给出
^@if\s?\(.*\)$
的(现已删除)答案是正确的。但是,我认为将OP试图做的事情的一个更基本的问题告知OP会更有帮助。我尝试了
^@if\s?(.*\)$
,但它给了我
找不到结尾分隔符
。我正在使用PHP5.3,有什么想法吗?是的,我的方法可能不正确,我正在尝试制作一个用于教育目的的模板lexer/parser。您将采取哪种方法?您不能用
$
将regexp锚定到行的末尾吗?这将阻止在右括号之后发生任何事情。
Array
(
    [0] => @if ((name == false) && 1 == 1)
    [1] => @if
    [2] => ((name == false) && 1 == 1)
)