regex: если строка содержит определенное слово внутри скобки, то удалите скобку и ее содержимое

Используя регулярное выражение, я хочу определить, существует ли конкретное слово в скобках в строке, если это так, удалите скобку и ее содержимое.

Я хочу настроить следующие слова:

picture see lorem 

Итак, вот три примера строк:

 $text1 = 'Hello world (see below).'; $text2 = 'Lorem ipsum (there is a picture here) world!'; $text3 = 'Attack on titan (is lorem) great but (should not be removed).'; 

Какое регулярное выражение можно использовать с preg_replace() :

 $text = preg_replace($regex, '' , $text); 

Удалить эти скобки и их содержимое, если они содержат эти слова?

Результат должен быть:

 $text1 = 'Hello world.'; $text2 = 'Lorem ipsum world!'; $text3 = 'Attack on titan great but (should not be removed).'; 

Вот идеон для тестирования.

Вы можете использовать следующий подход (спасибо @Casimir за указание ошибки до!):

 <?php $regex = '~ (\h*\( # capture groups, open brackets [^)]*? # match everything BUT a closing bracket lazily (?i:picture|see|lorem) # up to one of the words, case insensitive [^)]*? # same construct as above \)) # up to a closing bracket ~x'; # verbose modifier $text = array(); $text[] = 'Hello world (see below).'; $text[] = 'Lorem ipsum (there is a picture here) world!'; $text[] = 'Attack on titan (is lorem) great but (should not be removed).'; for ($i=0;$i<count($text);$i++) $text[$i] = preg_replace($regex, '', $text[$i]); print_r($text); ?> 

См. Демонстрацию на ideone.com и на regex101.com .

Вы можете использовать это регулярное выражение для поиска:

 \h*\([^)]*\b(?:picture|see|lorem)\b[^)]*\) 

Что значит

 \h* # match 0 or more horizontal spaces \( # match left ( [^)]* # match 0 or more of any char that is not ) \b # match a word boundary (?:picture|see|lorem) # match any of the 3 keywords \b # match a word boundary [^)]* # match 0 or more of any char that is not ) \) # match right ) 

и заменить пустой строкой:

Демо-версия RegEx

Код:

 $re = '/\h*\([^)]*\b(?:picture|see|lorem)\b[^)]*\)/'; $result = preg_replace($re, '', $input);