Php preg_match-忽略可选括号

Php preg_match-忽略可选括号,php,regex,preg-match,Php,Regex,Preg Match,我有以下字符串,其中包含与preg\u match匹配的可选括号。键是输入,值是预期输出: $strings=[ “(前缀)(参数中的字符串)”=>“参数中的字符串”, “(前缀)字符串不在参数中”=>“字符串不在参数中”, “(前缀)parens(结尾)”=>“parens(结尾)”, ]; 假设我想在单个preg_match中执行此操作,我目前有以下内容: preg\u match('/^\(前缀\)(\(.+)\)\.+)$/',$input,$matches); $output=(is

我有以下字符串,其中包含与
preg\u match
匹配的可选括号。键是输入,值是预期输出:

$strings=[
“(前缀)(参数中的字符串)”=>“参数中的字符串”,
“(前缀)字符串不在参数中”=>“字符串不在参数中”,
“(前缀)parens(结尾)”=>“parens(结尾)”,
];
假设我想在单个
preg_match
中执行此操作,我目前有以下内容:

preg\u match('/^\(前缀\)(\(.+)\)\.+)$/',$input,$matches);
$output=(isset($matches[2])?$matches[2]:$matches[1]);
这是可行的,但需要一个单独的子模式来检测所看到的格式。有没有更好的方法在单个子模式中实现这一点?在子模式的两端都假设可选的括号是不够的,因为我可能想包括一些括号


我知道我还有其他选择,比如分别剥离前缀和括号,但我想知道是否有更好的方法可以做到这一点,而不必先改变逻辑。

在一个捕获组中获取所有匹配项的一个选项是使用a从开始到结束的括号中捕获前缀之后的任何一个,或不带括号的行,但只能选择在末尾与之匹配

^\(prefix\)\h(?|\(([^()\n]+)\)|([^()\n]+(?:\([^()\n]+\))?))$
  • ^
    字符串的开头
  • \(prefix\)\h
    匹配
    (prefix)
    和水平空白字符
  • (?|
    分支重置组
    • \([^()\n]+)\
      直接从
      匹配,并在组1中捕获介于两者之间的内容
    • |
    • 捕获组2
      • [^()\n]+
        匹配除
        或换行符以外的任何字符
      • (?:\([^()\n]+\)?
        可选择匹配
    • 关闭第2组
  • 关闭分支重置组
  • $
    字符串结尾


或者正如您所指出的,这个模式
^\(前缀\)(?|\(.+)\)(.+)$
将是一个广泛的匹配,可以捕获括号之间的内容,也可以捕获后面的内容。

啊哈,看起来分支重置组正是我想要的。我知道我的正则表达式非常松散,但为了避免它看起来像是你答案的一个巨大飞跃,
^\(prefix\)(?|\(.+)\)(.+)$
,这将是一个很好的例子。@cmbuckley是的,你也可以使用它作为匹配,这取决于你希望模式的具体程度。使用
+
确实是一个非常广泛的匹配。绝对,我同意-我考虑了更多,以显示最小的变化可能,为任何其他人谁可能阅读的问题。