Не понимаю, почему захватило abea? ведь по идеи должно находить только цельное слово
echo preg_replace('#(ab)+#', '!', 'ab abab abab abababab abea');
должно было вывести только ! ! ! ! abea
а выводит ! ! ! ! !ea
Чтобы найти целое слово, состоящее из ab, используйте границы слова \b:
echo preg_replace('#\b(?:ab)+\b#', '!', 'ab abab abab abababab abea');
^^ ^^
// => ! ! ! ! abea
См. PHP-демо
Подробности
\b - начальная граница слова (перед текущей позицией может быть начало строки или цифра/буква/знак подчёркивания)(?:ab)+ - одно или более повторений последовательности букв ab ((?:...) — незахватывающая группа, используемая только для группирования символов/шаблонов)\b - конечная граница слова (после текущей позиции может быть конец строки или цифра/буква/знак подчёркивания)Используйте опережающую отрицательную проверку:
echo preg_replace('~(ab)+(?!ea)~', '!', 'ab abab abab abababab abea');
// Вывод : ! ! ! ! abea
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости