Не совсем понял почему вариант с регулярным выражением не устроил, но добавлю как ответ:
$str = 'car car was driving car was driving
car was was driving
car was driving driving
один один два три
один два два три три четыре
один два три четыре четыре';
$result = preg_replace('/\b(\p{L}+)(?:\s+\1\b)+/u', "$1", $str);
echo $result;
//car was driving car was driving
//car was driving
//car was driving
//один два три
//один два три четыре
//один два три четыре
О регулярном выражении:
\b(\p{L}+)(?:\s+\1\b)+
\b
- так называемая граница слова
(...)
- группа для захвата данных
\p{L}+
- один и более языковой символ (вон как в комментариях выше товарищ не забыл, что без параметра u
с кириллицей работать не будет)
(?:...)
- группа не захватывающая данные, нужна для квантификации, если слово повторяется более 2х раз
\s+
- один и более пробельных символов, по идее можно заменить на \h+
- один и более горизонтальных символов, что бы слово на новой строке не учитывалось если такое же есть в конце предыдущей сроки
\1
- возвращение захватываемой группы, т.е. на это место подставятся данные которые были захвачены в круглых скобках ранее.
Заменяется все на $1
что так же является данными захваченными в первую группу, что бы осталось одно слово из множества повторяющихся.