Удаление последовательных повторяющихся слов в строке
Я пытаюсь написать функцию, которая удаляет последовательные повторяющиеся слова в строке. Очень важно, чтобы совпадения, найденные регулярным выражением, оставались. Другими словами...
Очень очень очень грязная собака
должен стать...
Очень грязная собака
У меня есть регулярное выражение, которое, кажется, работает хорошо ( на основе этого поста)
(\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
?>
Попробуй это. Он должен вернуть одну копию без изменений.