2010-07-20 20 views

risposta

8

Parte del problema è che non si sta trattando il target come una stringa UTF-8; hai bisogno del modificatore /u per quello. Inoltre, in UTF-8 qualsiasi carattere non ASCII è rappresentato da due o più byte, tutti nell'intervallo \x80..\xFF. Prova questo:

preg_replace('/\p{Cc}+/u', '', $value) 

\p{Cc} è la proprietà Unicode per i caratteri di controllo, e le u cause sia l'espressione regolare e la stringa di destinazione da trattare come UTF-8.

+0

Lascia dei caratteri validi al di fuori dell'intervallo ASCII, come i caratteri diactrici polacchi (come ąęćśńżź)? Sto cercando un'espressione regolare che rimuova le sequenze UTF-8 non valide (quindi MySQL non si lamenterà mentre inserisce una stringa di questo tipo nel database), ma lascia intatto tutto il resto. – pako

+0

Penso che per quello dovresti usare ''/ \ P {Any}/u'' -' Any' dovrebbe essere auto-esplicativo, e '\ P {}' (maiuscolo) è la forma negata di '\ p {} '. Ma sarei più interessato a come quelle sequenze di byte non valide sono arrivate lì in primo luogo. –

5

È possibile utilizzare Unicode character properties

preg_replace('/[^\p{L}\s]/u','',$value); 

(Do aggiungere le altre classi che si desidera lasciar passare)

Se si desidera ripristinare unicode in ASCII, in alcun modo Fullproof ma con alcune traduzioni curato:

echo iconv('utf-8','ascii//translit','éñó'); //prints 'eno' 
+0

NOTA: l'URL sopra riportato non funziona e SO non mi consente di modificare la risposta; URL corretto è: http://php.net/manual/en/regexp.reference.unicode.php – DOOManiac

+0

@DOOManiac: OK, grazie per averlo indicato, corretto l'URL. – Wrikken

Problemi correlati