¿Hay forma de mantener el delimitador mientras se usa php explode u otras funciones similares?

Por ejemplo, tengo un artículo que debe dividirse de acuerdo con el límite de la oración, como ” . “, ” ? “, ” ! ” Y ” : “.

Pero también todos saben, ya sea preg_split o función de explode , ambos eliminan el delimitador.

¡Cualquier ayuda sería realmente apreciada!

EDITAR:

Solo puedo encontrar el código a continuación, pero funciona muy bien.

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

¡¡¡Gracias!!! Todo el mundo. ¡Solo quedan cinco minutos para obtener 3 respuestas! Y debo disculparme por no poder ver el manual de PHP detenidamente antes de hacer una pregunta. Lo siento.

preg_split con la bandera PREG_SPLIT_DELIM_CAPTURE

Volverá coincidencias array con delimiter = 0 , match = 1

Puede establecer el indicador PREG_SPLIT_DELIM_CAPTURE cuando usa preg_split y capturar los delimitadores también. Luego puede tomar cada par de 2 ny 2 n +1 y volverlos a unir:

 $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]; } 

Nota para empacar el delimitador de división en un grupo, de lo contrario no serán capturados.

Siento que vale la pena agregar esto. Puede mantener el delimitador en la cadena “después” utilizando regex lookahead para dividir:

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

Y si el delimitador es de longitud fija, puede mantener el delimitador en la parte “antes” utilizando lookbehind:

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

Esta solución es más simple y más limpia en la mayoría de los casos.