Sostituisci Newline, Tab, Space multipli

Voglio sostituire più caratteri Newline con un carattere Newline, più spazi con un singolo spazio.
Ho provato preg_replace("/\n\n+/", "\n", $text); e fallito!

Faccio anche questo lavoro sul $ text per la formattazione.

 $text = wordwrap($text,120, '<br/>', true); $text = nl2br($text); 

$ text è un grande text preso dall'utente per BLOG, e per una migliore formattazione io uso il wordwrap.

In teoria, l'espressione regolare funziona ma il problema è che non tutti i sisthemes operativi e i browser inviano solo \ n alla fine della string. Molti invieranno anche un \ r.

Provare:

Modifica: ho semplificato questo:

 preg_replace("/(\r?\n){2,}/", "\n\n", $text); 

Modifica: e per risolvere il problema di alcuni invio solo:

 preg_replace("/[\r\n]{2,}/", "\n\n", $text); 

Aggiornamento 1: basato sul tuo aggiornamento:

 // Replace multiple (one ore more) line breaks with a single one. $text = preg_replace("/[\r\n]+/", "\n", $text); $text = wordwrap($text,120, '<br/>', true); $text = nl2br($text); 

usa \ R (che rappresenta each sequenza di fine row):

 $str = preg_replace('#\R+#', '</p><p>', $str); 

trovato qui: http://forums.phpfreaks.com/topic/169162-solved-replacing-two-new-lines-with-paragraph-tags/

Documentazione PHP sulle sequenze di escape :

\ R (interruzione di row: corrisponde a \ n, \ r e \ r \ n)

Questa è la risposta, poiché comprendo la domanda:

 // normalize newlines preg_replace('/(\r\n|\r|\n)+/', "\n", $text); // replace whitespace characters with a single space preg_replace('/\s+/', ' ', $text); 

modificare

Questa è la function effettiva che utilizzo per convertire nuove linee in interruzioni di row HTML e elementi di paragrafo:

 /** * * @param string $string * @return string */ function nl2html($text) { return '<p>' . preg_replace(arrays('/(\r\n\r\n|\r\r|\n\n)(\s+)?/', '/\r\n|\r|\n/'), arrays('</p><p>', '<br/>'), $text) . '</p>'; } 

È necessario il modificatore multilinea per far corrispondere più righe:

 preg_replace("/PATTERN/m", "REPLACE", $text); 

Anche nel tuo esempio sembra che tu stia sostituendo 2+ newline con esattamente 2, che non è quello che la tua domanda indica.

Suggerirei qualcosa come questo:

 preg_replace("/(\r\n|\n|\r){2,}/", "$1", $str); 

Questo si prenderà cura di tutti i diversi SO che usano \n o \r o \r\n come carattere di fine row. Sostituirà 2 o più occorrenze di quei caratteri EOL usando backreference # 1, il che significa che EOL specifico della piattaforma sarà la sostituzione al posto di \n che potrebbe essere errata su alcune piattaforms.

Ho provato tutto sopra, ma non ha funzionato per me. Poi ho creato un lungo cammino per risolvere quel problema …

Prima :

 echo nl2br($text); 

Dopo :

 $tempData = nl2br($text); $tempData = explode("<br />",$tempData); foreach ($tempData as $val) { if(trim($val) != '') { echo $val."<br />"; } } 

E ha funzionato per me .. Ho scritto qui perché, se qualcuno è venuto qui per trovare una risposta come me.

Se vuoi solo sostituire più tabs con una sola scheda, usa il seguente codice.

 preg_replace("/\s{2,}/", "\t", $string); 

Prova questo:

 preg_replace("/[\r\n]*/", "\r\n", $text); 

Sostituisci la testa e la fine della string o del documento!

 preg_replace('/(^[^a-zA-Z]+)|([^a-zA-Z]+$)/','',$match);