Как предварительно заменить повторяющиеся слова

#php #regex #preg-replace

#php #регулярное выражение #preg-заменить

Вопрос:

Я пытаюсь preg_replace повторяющиеся слова, но ниже остается несколько слов. Я думаю, что это займет только первые два.

 <?php
$text ='around background background background background';
$non_repeat = preg_replace("/b(w )s \1b/i", "$1", $text);
echo $non_repeat;
?>
  

Как это исправить?

Ответ №1:

Чтобы исключить все повторяющиеся слова, используйте это:

 $replaced = preg_replace('~b(w )Kb(?:s*1) ~', '', $yourstring);
  

Посмотрите на вторую цветную группу в демонстрации.

Объяснение

  • b является ли начальное слово границей
  • (w ) записывает слово в группу 1
  • K Сообщает движку удалить то, что было сопоставлено до сих пор с окончательным совпадением, которое он возвращает
  • b является ли граница закрывающего слова
  • (?:s*1) сопоставляет необязательные пробелы, затем группирует 1, один или несколько раз
  • мы заменяем это пустой строкой

Комментарии:

1. К вашему сведению: добавлена демонстрация и объяснение. 🙂

Ответ №2:

Приведенное ниже регулярное выражение заменит все фоновые строки одной фоновой строкой,

 b(w )(?:s1) 
  

ДЕМОНСТРАЦИЯ

Ваш PHP-код будет,

 <?php
$text ='around background background background background';
$non_repeat = preg_replace("/b(w )(?:s\1) /i", "$1", $text);
echo $non_repeat;
?>  //=> around background
  

IDEONE