Удаление последовательных повторяющихся слов в строке

Я пытаюсь написать функцию, которая удаляет последовательные повторяющиеся слова в строке. Очень важно, чтобы совпадения, найденные регулярным выражением, оставались. Другими словами...

Очень очень очень грязная собака

должен стать...

Очень грязная собака

У меня есть регулярное выражение, которое, кажется, работает хорошо ( на основе этого поста)

(\b\S+\b)(($|\s+)\1)+

Однако я не уверен, как использовать preg_replace (или, если есть лучшая функция) для реализации этого. Прямо сейчас у меня есть удаление всех соответствующих повторяющихся слов, не оставляя одну копию слова в целости. Могу ли я проанализировать переменную или специальную инструкцию, чтобы сохранить совпадение?

У меня есть это в настоящее время...

$string=preg_replace('/(\b\S+\b)(($|\s+)\1)+/', '', $string);

2 ответа

Решение

Вы можете использовать регулярные выражения, такие как \b(\S+)(?:\s+\1\b)+ и заменить на $1:

$string=preg_replace('/\b(\S+)(?:\s+\1\b)+/i', '$1', $string);

Посмотреть демо-версию регулярного выражения

Детали:

  • \b(\S+) - Группа 1 захватывает один или несколько непробельных символов, которым предшествует граница слова (может быть \b(\w+) лучше подойдет здесь)
  • (?:\s+\1\b)+ - 1 или более последовательностей:
    • \s+ - 1 или более пробелов
    • \1\b - обратная ссылка на значение, хранящееся в буфере группы 1 (значение должно быть целым словом)

Шаблон замены $1обратная ссылка замены, которая ссылается на значение, хранящееся в буфере группы 1.

Обратите внимание, что /i модификатор без учета регистра сделает \1 без учета регистра, и I have a dog Dog DOG приведет к I have a dog,

<?php
$text ='one one, two three, two';
$result_text = preg_replace("/\b(\w+)\s+\\1\b/i", "$1", $text);
echo "Result Text: ".$result_text; //one, two three, two
?>

Попробуй это. Он должен вернуть одну копию без изменений.

Другие вопросы по тегам