0

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

例子:

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

想要的结果:

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

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

感谢您的任何反馈。

4

5 回答 5

3

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

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

现在发表一些评论:

1) 我将把 sed/perl 样式转换为 PHP 样式的正则表达式留给您。

2) 很难阅读,因为 ( ) 是特殊字符。基本上我是说“只要不包含任何or就((...))替换every 。老实说,我没有测试我写下的烂摊子,但有了这个想法,你应该能够修复。(...)...()

这总是成对地删除它们。

基本上这里的道德是:您问了一个简单的正则表达式无法解决的问题 - 成对删除需要比语言允许的更多状态。但是,如果您遍历简单的正则表达式并从内到外吃掉双打,那么这个是唾手可得的。

于 2012-06-12T15:32:20.173 回答
1

这很容易。

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

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

preg_replace(array('~\(+~', '~\)+~'), array('(', ')'), $string);
于 2012-06-12T15:31:00.793 回答
0

试试这个:

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

演示

于 2012-06-12T15:32:29.597 回答
0

这不适用于嵌套括号,但是使用正则表达式很难做到正确(并且取决于引擎甚至不可能):

preg_replace(array('/\(+/', '/\)+/'), array('(', ')'), $text);
于 2012-06-12T15:32:46.190 回答
0

你可以试试这个:

preg_replace("([\\(]{1,})", "(", preg_replace("([\\)]{1,})", ")", $your_string));
于 2012-06-12T16:05:17.660 回答