2009-04-08 13 views
5

Sto cercando qualcosa come trim() ma all'interno dei limiti di una stringa. Gli utenti a volte inseriscono 2, 3, 4 o più ritorni di linea dopo aver digitato, ho bisogno di disinfettare questo input.Rimuovere i ritorni di riga eccessivi

ingresso Esempio

i like cats 


my cat is happy 
i love my cat 



hope you have a nice day 

output desiderato

i like cats 

my cat is happy 
i love my cat 

hope you have a nice day 

non sto vedendo nulla integrato, e una stringa sostituire avrebbe preso molte iterazioni di esso per fare il lavoro. Prima di montare una piccola stringa ricorsiva, volevo vedere quali altri suggerimenti avevi tutti.

Ho una strana sensazione che ci sia una regex anche per questo.

risposta

3

finalmente sono riuscito a farlo, ha bisogno di preg così si utilizza la versione PCRE in PHP, e ha bisogno anche di una stringa di n sostitutiva \ \ n, al fine di non cancellare tutti i fine riga, ma uno:.

$body = preg_replace("/\n\n+/", "\n\n", $body); 

Grazie per avermi portato sulla strada giusta

+0

Forse dovresti selezionare la risposta accettata (tharkun) in modo che questa domanda sia contrassegnata come risposta (e tolta dalla coda senza risposta). – Calvin

3

Quanto testo è necessario eseguire? Se è inferiore a circa 100k allora si potrebbe probabilmente solo usare una semplice ricerca e sostituzione regex (ricerca qualcosa come /\n+/ e sostituirli con \n)

D'altra parte, se avete bisogno di passare attraverso megabyte di dati, allora si potrebbe analizza il testo carattere per carattere, copiando l'input per l'output, tranne quando si incontrano nuove righe multiple, nel qual caso devi solo copiare una nuova riga e ignorare il resto.

Non suggerirei una stringa ricorsiva, tuttavia, sembra che sarebbe molto molto lento.

+0

Non molto, una email valida per un utente che invia un'email, fa parte di un sistema web. –

10
function str_squeeze($body) { 
    return preg_replace("/\n\n+/", "\n\n", $body); 
} 
+0

Restituisce tutte le righe separate da una \ n, dopo aver modificato "a" negli argomenti –

+0

Un'espressione regolare (leggermente) più snella sarebbe simile a questa: preg_replace ("/ \ n {2,} /", "\ n \ n ", $ body); – KOGI

+0

grazie KOGI. ottimizzato, beh, è ​​leggermente più codice. È più veloce? – markus

2

La seguente espressione regolare dovrebbe rimuovere più interruzioni di linea, ignorando le interruzioni di linea singoli, che vanno bene per la tua definizione:

ereg_replace("\n\n+", "\n\n", $string); 

è possibile verificare con questo PHP Regular Expression test tool, che è molto utile (ma come sembra non in perfetta parità con PHP).

[EDIT] Risolto il 'a", in quanto non sembra funzionare ammettere che ho appena testato la regex nello strumento Web;..)

+0

Non ho ottenuto risultati finché non ho modificato il comando "in a" nell'espressione e sostituito. Quindi funziona, ma uccide \ n \ n –

+0

La regex non è in perfetta parità con php. Continuerò a cercare una soluzione. –

3

Per considerare tutte e tre le sequenze di interruzione di riga:

preg_replace('/(?:\r\n|[\r\n]){2,}/', "\n\n", $str) 
+0

Grazie, eseguo una riga che termina unificatore prima di eseguire preg_replace ("/ \ n \ n + /", "\ n \ n", $ body); –

Problemi correlati