2016-03-13 2 views
2

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

Слова, которые я хочу предназначаться являются:

picture 
see 
lorem 

Итак, вот 3 струнные примеры:

$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).'; 

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

+2

Я буду набирать этот вопрос с 50 очками, когда он имеет право на участие. –

+0

А где именно вы застряли? Вы пробовали что-нибудь, чтобы добраться до своей цели? – Rizier123

ответ

6

Вы можете использовать следующий подход (спасибо @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); 
?> 

См a demo on ideone.com и on regex101.com.

+2

Благодарим за код Jan. У меня осталось 2 вопроса, хотя с вашим регулярным выражением. ** Если ** открывающая скобка имеет пустое пространство перед ним, а затем удалите это пустое пространство при удалении скобки: https://regex101.com/r/nT0wI5/2 Он должен все еще обнаруживать скобки, у которых нет места перед ними. Надеюсь, что у меня есть смысл. –

+0

@HenrikPetterson: Обновлено, см. Https://regex101.com/r/nT0wI5/3 I upda Ответ тоже. – Jan

+0

ДА! Это именно то, что я ищу.Один последний запрос. Есть ли способ сделать регистр нечувствительным к регистру? Поэтому он должен совпадать с «See» и «SeE». –

3

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

\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 Demo

Код:

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

$result = preg_replace($re, '', $input); 
+1

Спасибо. Есть ли способ сделать регулярное выражение обнаруженным, если перед открывающейся скобкой * открытия * есть пустое пространство, и если это произойдет, при удалении скобок также удалите это пустое пространство. В противном случае у вас останутся двойные пробелы. Также, для завершения, можете ли вы добавить свое регулярное выражение в инструкцию preg_replace(). –

+3

У меня был '\ h *' before '(' который соответствовал 0 или пробелам, которые можно изменить на '\ h +', чтобы соответствовать 1 или более пробелам перед '(' (см. Обновленный ответ) – anubhava

+2

Спасибо за обновление, хотя он не обнаруживает, если скобки, если нет свободного пространства рядом с открывающей скобкой (что должно). См. этот пример: https://regex101.com/r/oJ0gC9/4 –

Смежные вопросы