Php 告诉正则表达式在引号内时忽略括号

Php 告诉正则表达式在引号内时忽略括号,php,regex,regex-group,Php,Regex,Regex Group,我有以下已使用且有效的正则表达式: /\B@(@?\w+(?:\w+)([\t]*)(\(((?>[^()])+)|(?3))*\)/x 其中该字符串@扩展('template','test')正确分组并提供我所需的内容 问题是,如果字符串的引号中包含未闭合的括号,则将失败: @extends('template','te)st')将@extends('template','te)作为输出 我如何告诉这个正则表达式忽略引号内的括号(无论是“还是”) 下面是该问题的RegExr演示: 下面是所有人

我有以下已使用且有效的正则表达式:

/\B@(@?\w+(?:\w+)([\t]*)(\(((?>[^()])+)|(?3))*\)/x

其中该字符串
@扩展('template','test')
正确分组并提供我所需的内容

问题是,如果字符串的引号中包含未闭合的括号,则将失败:

@extends('template','te)st')
@extends('template','te)
作为输出

我如何告诉这个正则表达式忽略引号内的括号(无论是
还是

下面是该问题的RegExr演示:

下面是所有人都可以通过的字符串列表:

@extends('template', 'test')     // working
@extends('template', $test)      // working
@extends('template', 'te()st')   // working
@extends('template', 'te)st')    // broken 
@extends('template', 'te())st')  // broken
@extends('template', 'te(st')    // broken
@extends('template', 'test)')    // broken
@extends('template', '(test')    // broken
我已经缩小了范围——我想我需要能够说

(
   \(  <-- only if not inside quotes
     ( 
         (?>[^()]+) | (?3) 
     )* 
   \) <-- only if not inside quotes  
)?
(
\(  [^()]+) | (?3) 
)* 

\)为此,您可以使用lookahead

这是我的正则表达式,它将与所有
扩展的第二个参数相匹配

(?=(\w+)\w+())[\w)(]+

细分:

:开始搜索带引号的字符串

?=XXX)
:积极向前看,确保XXX在前面

(\w+\)\w+\()
:搜索左大括号或右大括号

现在,如果这个前瞻是成功的,我们可以确定我们有一个引号,后面有一个括号

[\w\)\(]+
:就是这样做的

现在我们可以找到带括号的引号,我们可以使用if-else条件为每种情况使用适当的规则

(?(?=regex)然后| else)

下面是我如何实现它的:

(?(?='(?=(\w+\)|\w+\())) <- condition, same as above
'[\w\)\(]+' <- We have a match so we ignore parenthesis
|'\w+' <- Here we don't
)

(?(?=”(?=(\w+\)\w+\())谢谢@Mayank-很接近-但它没有在您的测试用例中包含最后的
?附言。我添加了一个额外的测试用例,我忘了在原始问题中包含它。