正则表达式删除多个括号

时间:2012-06-12 15:28:25

标签: php regex parentheses

我需要一个正则表达式,如果找到,可以删除字符串中不必要的/额外的括号。

例如:

Bob Barker LIVE! (((Don't Miss out!)))

通缉结果:

Bob Barker LIVE! (Don't Miss out!)

我不在乎你是否使用它们,只要它们不过度使用它们,并确保关闭它们。

感谢您的任何反馈。

5 个答案:

答案 0 :(得分:2)

您可以使用正则表达式+递归有效地执行此操作。这样做直到它停止做任何事情:

s/\(\([^()]*)\)\)/\(\1\)/g

现在有些评论:

1)我将它留给你将sed / perl风格转换为PHP风格的正则表达式。

2)很难阅读,因为()是特殊字符。基本上我说“只要((...))不包含任何(...)...,就用(替换每个)。说实话我没做过不要测试我写下来的混乱,但有了这个想法,你应该能够修复。

这总是成对地删除它们。

基本上,这里的道德是:你问了一个简单的正则表达式无法解决的问题 - 成对删除需要比语言允许的状态更多的状态。但是,如果你在简单的正则表达式上进行迭代并从内到外吃掉双打,那么这个结果就是昙花一现。

答案 1 :(得分:1)

这很容易。

preg_replace('~[\(\)]+~', '', $string);

编辑:我没有读完你的整个问题。你仍然想要括号,而不是重复。

preg_replace(array('~\(+~', '~\)+~'), array('(', ')'), $string);

答案 2 :(得分:0)

试试这个:

preg_replace( '/\(+(.*?)\)+/', '($1)', 'Bob Barker LIVE! (((Don\'t Miss out!)))');

Demo

答案 3 :(得分:0)

这对于嵌套括号不起作用,但 很难用正则表达式进行处理(取决于引擎甚至不可能):

preg_replace(array('/\(+/', '/\)+/'), array('(', ')'), $text);

答案 4 :(得分:0)

你可以试试这个:

preg_replace("([\\(]{1,})", "(", preg_replace("([\\)]{1,})", ")", $your_string));