Есть ли способ сохранить разделитель при использовании php explode или других подобных функций?

Например, у меня есть статья, которая должна быть разделена по границе предложения, например ".", "?", "!" и ":".

Но также все знают, работают ли функции preg_split или explode, они оба удаляют разделитель.

Любая помощь будет действительно оценена!

EDIT:

Я могу только придумать код ниже, он отлично работает.

$content=preg_replace('/([\.\?\!\:])/',"\\1[D]",$content);

Спасибо!!! Все. Получать 3 ответа - всего пять минут! И я должен извиниться за то, что вы не смогли внимательно ознакомиться с руководством по PHP, прежде чем задавать вопрос. Сожалею.

Ответ 1

preg_split с флагом PREG_SPLIT_DELIM_CAPTURE

Вернет массив совпадений с delimiter = 0, match = 1

Ответ 2

Вы можете установить флаг PREG_SPLIT_DELIM_CAPTURE при использовании preg_split и зафиксировать разделители. Затем вы можете взять каждую пару 2n и 2n + 1 и вернуть их вместе:

$parts = preg_split('/([.?!:])/', $str, -1, PREG_SPLIT_DELIM_CAPTURE);
$sentences = array();
for ($i=0, $n=count($parts)-1; $i<$n; $i+=2) {
    $sentences[] = $parts[$i].$parts[$i+1];
}
if ($parts[$n] != '') {
    $sentences[] = $parts[$n];
}

Примечание, чтобы упаковать разделительный разделитель в группу, иначе они не будут записаны.

Ответ 3

Я чувствую, что это стоит добавить. Вы можете сохранить разделитель в строке "после", используя

И если разделитель имеет фиксированную длину, вы можете сохранить разделитель в части "before" с помощью lookbehind:

$input = "The address is http://stackoverflow.com/";
$parts = preg_split('@(?<=http://)@', $input);
// $parts[0] is "The address is http://"

В большинстве случаев это решение проще и чище.