2012-06-12 2 views
-1

Мне нужно регулярное выражение, которое может удалить ненужную/дополнительную скобку в строке, если она найдена.

Пример:Регулярное выражение для удаления нескольких скобок

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

Wanted Результат:

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

меня не волнует, если пользователи вам их, пока они не более чем использовать их, и убедитесь, чтобы закрыть их ,

Благодарим за любую отзыв.

+3

T o какие правила замены? Соответствующие круглые скобки или просто свертывание последовательных открытий или закрытий parens? - Кроме того, вы еще что-то пробовали? – mario

+2

Как насчет '((fo (o)) ((bar)))' и '(((((foo)'? – Qtax

ответ

1

Это достаточно легко.

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

Редактировать: я не читал весь ваш вопрос. Вы все еще хотите скобки, а не дубликаты.

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

кажется, что все круглые скобки – Esailija

+0

Это отлично работает для меня, однако, если вход «Bob Barker LIVE! (((Не пропустите!)) («Вывод:« Боб Баркер ЖИВ! »(« Не пропустите! ») (« Последний »(« не закрыт и должен быть удален ». – socca1157

+0

@ socca1157 вы должны указать требования в OP – Esailija

2

Вы можете сделать это эффективно с регулярным выражением + рекурсия. Сделайте это, пока он не перестанет делать что-нибудь:

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

Теперь некоторые комментарии:

1) Я оставляю это вам конвертировать/стиль патч в PERL в PHP стиль регулярных выражений.

2) Трудно читать, потому что() являются специальными символами. В основном я говорю: «Заменяйте каждый ((...))(...), пока ... не содержит ( или ). И, честно говоря, я не проверял беспорядок, который я записал, но с этой идеей вы должны иметь возможность ремонта.

Это всегда удаляет их в парах

в основном нравственную здесь:.. вы задали вопрос, который вы не можете сделать с помощью простого регулярного выражения - удаление в паре требует больше, чем состояния разрешений языка Но эта низко висящие фрукты, если вы перебираете простое регулярное выражение и кушаете дублеты от наизнанку.

0

Попробуйте следующее:

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

Demo

0

Это не будет работать должным образом для вложенных скобок, но это действительно трудно получить права с регулярным выражением (и в зависимости от двигателя даже невозможно):

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

Вы можете попробовать:

preg_replace("([\\(]{1,})", "(", preg_replace("([\\)]{1,})", ")", $your_string)); 
Смежные вопросы