4

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

我有一个这样的字符串:

$string = "Hustlin' ((Remix) Album Version (Explicit))";

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

所以我希望结果只是"Hustlin' ".

我尝试了以下方法:

preg_replace("/\(.*?\)/", '', $string);|

它返回奇数结果:"Hustlin' Album Version )"

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

4

3 回答 3

10

您的模式\(.*?\)与 a 匹配(,然后将找到第一个)(以及介于两者之间的所有内容):模式将如何“理解”以匹配平衡括号?

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

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

会打印:

Hustlin'以速度!

模式的简短分解:

\(         # 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 ')'
于 2012-10-06T19:17:16.603 回答
0

用内部的正则表达式替换做一个简单的循环。

仅替换第一次出现的

/\([^()]*\)/

使用空字符串并重复此操作,直到找不到匹配项。

于 2012-10-06T19:01:16.340 回答
0

回答您的问题:您的正则表达式语句使用preg_replace 匹配并删除第一次出现的括号序列及其内部的所有内容- 无论是否出现另一个左括号。

于 2012-10-06T19:12:09.537 回答