2010-05-30 18 views
11

Por ejemplo, tengo un artículo que debe dividirse según el límite de frase como ".", "?", "!" y ":".¿Hay forma de mantener el delimitador mientras se usa php explode u otras funciones similares?

Pero como todos saben, ya sea preg_split o funcionan, ambos eliminan el delimitador.

¡Cualquier ayuda sería muy apreciada!

EDIT:

que sólo puede llegar con el código de abajo, funciona muy bien sin embargo.

$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.

Respuesta

7

preg_split con PREG_SPLIT_DELIM_CAPTURE bandera

Volverá gama partidos con delimiter = 0, match = 1

14

Puede establecer la marca PREG_SPLIT_DELIM_CAPTURE al utilizar preg_split y capturar también los delimitadores. A continuación, puede tomar cada par de 2 n y 2 n + 1 y volver a ponerlos juntos:

$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 la división en un grupo, de lo contrario no serán capturados.

+0

Justo lo que quería hacer ... pero era demasiado ruidoso para escribir :-) – Juergen

15

Siento que esto es la pena añadir. Puede mantener el delimitador de la cadena "después" mediante el uso de 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, se puede mantener el delimitador en el "antes" parte mediante el uso de búsqueda hacia atrás:

$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.

Cuestiones relacionadas