2012-09-22 21 views
7

Sto utilizzando la seguente espressione regolare per rimuovere tutti i caratteri invisibili da una stringa UTF-8:UTF 8 String rimuovere tutti i caratteri invisibili, tranne newline

$string = preg_replace('/\p{C}+/u', '', $string); 

Questo funziona bene, ma come faccio a modificare in modo che rimuove tutti i personaggi invisibili TRANNE le nuove linee? Ho provato alcune cose usando [^ \ n] ecc. Ma non funziona.

Grazie per l'aiuto!

Edit: carattere di nuova riga è '\ n'

risposta

5

Utilizzare una "doppia negazione":

$string = preg_replace('/[^\P{C}\n]+/u', '', $string); 

Spiegazione:

  • \P{C} è lo stesso di [^\p{C}].
  • Pertanto, [^\P{C}] corrisponde a \p{C}.
  • Dato che ora abbiamo una classe di caratteri negata, possiamo sottrarre altri caratteri come \n da esso.
+0

Grazie! Questo sembra funzionare perfettamente :) – Stefan

0

prima di farlo, sostituire a capo (suppongo si utilizza qualcosa come \n) con una stringa casuale come ++++++++ (qualsiasi stringa che non verrà rimosso dal vostro espressione regolare e non si verifica naturalmente nella stringa in primo luogo), quindi eseguire il tuo preg_replace, quindi sostituire ++++++++ con \n di nuovo.

$string=str_replace('\n','++++++++',$string); //Replace \n 
$string=preg_replace('/\p{C}+/u', '', $string); //Use your regexp 
$string=str_replace('++++++++','\n',$string); //Insert \n again 

Che dovrebbe fare. Se si utilizza <br/> invece di \n semplicemente utilizzare nl2br per preservare interruzioni di riga e sostituire <br/> invece di \n

+0

\ n lo è. Quello che hai descritto è quello che sto usando in questo momento, ma non penso che sia così pulito come la regex potrebbe farlo (penso, ma non so come) – Stefan

2

mio utilizzando un'affermazione negativa è possibile una classe di caratteri se non quello che l'affermazione corrisponde, in modo da:

$res = preg_replace('/(?!\n)\p{C}/', '', $input); 

(Il dialetto PHP delle espressioni regolari non supporta la sottrazione delle classi di caratteri che altrimenti sarebbe un altro approccio: [\p{C}-[\n]].)

+0

Ho provato, non rimuove i newline, inoltre non rimuove altri caratteri invisibili (entrambi gli approcci) – Stefan

+0

@Stefan È inteso a non rimuovere i ritorni a capo: vedere il titolo di Q "* eccetto * newline". – Richard

+0

Oh mi dispiace, volevo dire è che rimuove i newline. – Stefan

Problemi correlati