2010-05-30 9 views
11

Ad esempio, è necessario suddividere un articolo in base al limite della frase, ad esempio ".", "?", "!" e ":".C'è un modo per mantenere il delimitatore durante l'uso di php explode o altre funzioni simili?

Ma come ben sanno, sia la funzione preg_split o explode, entrambi rimuovono il delimitatore.

Qualsiasi aiuto sarebbe molto apprezzato!

EDIT:

posso venire solo con il codice qui sotto, funziona benissimo comunque.

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

Grazie !!! Tutti. Sono solo cinque minuti per ottenere 3 risposte! E devo scusarmi per non essere stato in grado di vedere attentamente il manuale PHP prima di fare domande. Scusate.

risposta

7

preg_split con PREG_SPLIT_DELIM_CAPTURE bandiera

Tornerà partite array con delimiter = 0, match = 1

14

È possibile impostare il flag PREG_SPLIT_DELIM_CAPTURE quando si utilizza preg_split e catturare i delimitatori troppo. Poi si può prendere ogni coppia di 2 n e 2 n 1 e rimetterli insieme:

$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 per imballare il delimitatore dividendosi in un gruppo, altrimenti non saranno catturati.

+0

Proprio quello che volevo fare ... ma ero troppo laisy per digitare :-) – Juergen

15

sento che questo è la pena di aggiungere. È possibile mantenere il delimitatore nella stringa "dopo" utilizzando regex lookahead per dividere:

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

E se il delimitatore è di lunghezza fissa, è possibile mantenere il delimitatore nella "prima" parte utilizzando lookbehind:

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

Questa soluzione è più semplice e pulita nella maggior parte dei casi.

Problemi correlati