У меня получилось нечто иное. Доработать, конечно придется

. Но наброски я на досуге сделал.
Функция вызывается относительно одного слова, что плохо в общем-то. Когда мы "слайсим" массив исходного текста (вырезаем участок слов), можно еще проверять имеют ли последний вырезанный участок и предпоследний - пересечения (array_intersect), если да, то объединять (имплодить их) не символом многоточия, а пробелом. Ну и так далее. Сорри, ничего из-за спешки более дельного изобратить не смог.