2009-05-03 20 views
11

Sto sviluppando un codice single serving site in PHP che visualizza semplicemente i messaggi inviati dai visitatori (che idealmente circonda l'argomento del sito Web). Chiunque può pubblicare fino a tre messaggi all'ora.Rimozione di interruzioni di riga ridondanti con espressioni regolari

Poiché il sito web sarà solo una pagina, vorrei controllare la lunghezza verticale di ciascun messaggio. Tuttavia, desidero almeno in parte preservare le interruzioni di riga nel messaggio originale. Un compromesso sarebbe quello di consentire due interruzioni di riga, ma se ce ne sono più di due, quindi sostituirle con un totale di due interruzioni di riga di seguito. Stack Overflow implementa questo.

Ad esempio:

"porcospini \ Nare \ n \ n \ n \ nporcupiney."

sarebbe cambiato per

"porcospini < br /> sono < br /> < br /> porcupiney."

Un aspetto difficile del controllo delle interruzioni di riga è la possibilità che vengano raccolti e memorizzati come \ r \ n, \ r o \ n. Ho pensato di convertire tutte le interruzioni di riga in < br /> s utilizzando nl2br(), ma ciò sembrava non necessario.

La mia domanda: Usando le espressioni regolari in PHP (con funzioni come preg_match() e preg_replace()), come posso verificare le istanze di più di due interruzioni di riga di una riga (con o senza spazio vuoto tra di esse) e quindi modificarli per un totale di due interruzioni di riga?

risposta

30
preg_replace('/(?:(?:\r\n|\r|\n)\s*){2}/s', "\n\n", $text) 
+0

Grazie caos! Funziona esattamente come desiderato. Anche la tua risposta originale ha funzionato. – tevan

+0

La risposta originale non ha soddisfatto il criterio "con o senza spazio vuoto tra di loro". :) – chaos

+0

Ma quando c'è solo un'interruzione di riga, la cambia in due? Non dovrebbe lasciare una singola pausa così com'è? – NonCoder

6

Qualcosa di simile

preg_replace('/(\r|\n|\r\n){2,}/', '<br/><br/>', $text); 

dovrebbe funzionare, credo. Anche se non ricordo esattamente la sintassi PHP, potrebbe essere necessario un po 'più di escape: -/

+0

Grazie David. L'unico problema che vedo con l'espressione regolare che hai postato è che non accetta spazi tra le interruzioni di riga. – tevan

+0

Ah, vero ... Ho perso la parte della tua domanda in cui hai menzionato gli spazi tra le interruzioni di riga. –