在PHP中使用正则表达式删除嵌套括号

And*_*Hin 4 php regex

可能重复:
可以使用正则表达式来匹配嵌套模式吗?

我有一个像这样的字符串:

$string = "Hustlin' ((Remix) Album Version (Explicit))";
Run Code Online (Sandbox Code Playgroud)

我想基本上删除括号中的所有内容.在上面使用嵌套括号的情况下,我想在顶层删除它.

所以我希望结果就是这样"Hustlin' ".

我尝试了以下方法:

preg_replace("/\(.*?\)/", '', $string);|
Run Code Online (Sandbox Code Playgroud)

它返回奇怪的结果:"Hustlin' Album Version )".

有人可以解释这里发生了什么吗

Bar*_*ers 9

你的模式\(.*?\)匹配a (然后会找到第一个)(以及介于两者之间的所有东西):模式如何"理解"以匹配平衡括号?

但是,您可以使用PHP的递归模式:

$string = "Hustlin' ((Remix) Album Version (Explicit)) with (a(bbb(ccc)b)a) speed!";
echo preg_replace("/\(([^()]|(?R))*\)/", "", $string) . "\n";
Run Code Online (Sandbox Code Playgroud)

会打印:

Hustlin'  with  speed!

短暂的分解模式:

\(         # match a '('
(          # start match group 1
  [^()]    #   any char except '(' and ')'
  |        #   OR
  (?R)     #   match the entire pattern recursively
)*         # end match group 1 and repeat it zero or more times
\)         # match a ')'
Run Code Online (Sandbox Code Playgroud)