То, что вы здесь делаете, не вполне разделение на пунктуацию, потому что вы пытаетесь сохранить пунктуацию в одном из разделенных пунктов. Вы также пытаетесь отбросить пробел после этого, но, похоже, не учли это в своем вопросе.
Я бы решил это следующим образом: разбить входную строку с помощью регулярного выражения, которое соответствует пунктуации или URL, и сохранить части, включая разделители. Затем выполните итерации по элементам, и для каждого разделителя определите, была ли это пунктуация, в этом случае вы можете убрать конечный пробел и переместить его в конец предыдущего элемента, или в URL, в этом случае вы просто присоединяете его к предыдущему и следующие пункты.
В PHP вы можете хранить разделители, используя что-то вроде этого:
$text[$i] = preg_split('/([\.\?!\-]+|https?:\/\/\S+)/', $post->text, PREG_SPLIT_DELIM_CAPTURE);
, где флаг PREG_SPLIT_DELIM_CAPTURE
объясняется в документации как:
Если этот флаг установлен, в скобках
выражение в шаблоне разделителя
будет также захвачен и возвращен.