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

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

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

Любая помощь могла бы быть полезна!

РЕДАКТИРОВАТЬ:

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

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

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

preg_split с флагом PREG_SPLIT_DELIM_CAPTURE

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

Вы можете установить флаг PREG_SPLIT_DELIM_CAPTURE при использовании preg_split и захватить разделители. Затем вы можете взять каждую пару из 2 n и 2 n +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]; } 

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

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

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

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

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

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