2012-05-08 25 views
10

Sono stato conesplodere un paragrafo in frasi in PHP

explode(".",$mystring) 

per dividere un paragrafo in frasi. Tuttavia questo non copre frasi che sono state concluse con diversi segni di punteggiatura come! ? :;

C'è un modo di usare un array come delimitatore invece di un singolo carattere? In alternativa esiste un altro modo per dividere con la punteggiatura?

ho cercato

explode(("." || "?" || "!"),$mystring) 

si spera, ma non ha funzionato ...

+0

uso delle espressioni regolari per abbinare modello e memorizzare il valore in una variabile, passare la variabile come parametro di esplodere – sree

+0

Dai un'occhiata a http://stackoverflow.com/questions/5032210/php-sentence-boundaries-detection – Boby

risposta

6

Si può fare:

preg_split('/\.|\?|!/',$mystring); 

o (più semplice):

preg_split('/[.?!]/',$mystring); 
+1

Questo metodo rimuove gli arresti completi ecc. Dalla stringa finale. – 472084

0
$mylist = preg_split("/[\.|\?!:;]/", $mystring); 
0

Non è possibile avere più delimitatori per esplodere. Questo è ciò che è preg_split();. Ma anche in questo caso, esplode al delimitatore, quindi otterrai le frasi restituite senza i segni di punteggiatura. Si può prendere preg_split un passo più in là e la bandiera a loro tornare nei propri elementi con PREG_SPLIT_DELIM_CAPTURE e quindi eseguire un certo ciclo per implodere frase e seguente marchio punteggiatura nella matrice restituita, o semplicemente usare preg_match_all();:

preg_match_all('~.*?[?.!]~s', $string, $sentences); 
1
preg_split('/\s+|[.?!]/',$string); 

Un possibile problema potrebbe essere se c'è un indirizzo e-mail in quanto potrebbe dividerlo su una nuova linea a metà.

2

Supponendo che si vuole realmente i segni di punteggiatura, con il risultato finale, hai provato:

$mystring = str_replace("?","?---",str_replace(".",".---",str_replace("!","!---",$mystring))); 
$tmp = explode("---",$mystring); 

che avrebbe lasciato i vostri segni di punteggiatura in tatto.

0

Si può provare preg_split

$sentences = preg_split("/[\.\?\!,;]+/", $mystring); 

Si prega di notare questa rimuoverà i segni di interpunzione. Se si desidera mettere a nudo fuori iniziali o finali spazi così

$sentences = preg_split("/[\.\?\!,;]+\s+?/", $mystring); 
11

È possibile utilizzare preg_split() combinato con un PCRE lookahead condition per dividere la stringa dopo ogni occorrenza di ., ;, :, ?, !, ..mantenendo la punteggiatura reale intatta:

Codice:

$subject = 'abc sdfs. def ghi; this is [email protected]! asdasdasd? abc xyz'; 
// split on whitespace between sentences preceded by a punctuation mark 
$result = preg_split('/(?<=[.?!;:])\s+/', $subject, -1, PREG_SPLIT_NO_EMPTY); 
print_r($result); 

Risultato:

Array 
(
    [0] => abc sdfs. 
    [1] => def ghi; 
    [2] => this is [email protected]! 
    [3] => asdasdasd? 
    [4] => abc xyz 
)