2010-07-20 55 views

Respuesta

8

Parte del problema es que no está tratando el objetivo como una cadena UTF-8; necesita el modificador /u para eso. Además, en UTF-8, cualquier carácter no ASCII está representado por dos o más bytes, todos ellos en el rango \x80..\xFF. Prueba esto:

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

\p{Cc} es la propiedad Unicode para caracteres de control, y las causas u tanto la expresión regular y la cadena de destino que ha de tratarse como UTF-8.

+0

¿Dejará caracteres válidos fuera del rango ASCII, como los caracteres diacétricos polacos (como ąęćśńżź)? Estoy buscando una expresión regular que elimine las secuencias UTF-8 no válidas (por lo que MySQL no se quejará al insertar dicha cadena en la base de datos), pero deje todo lo demás intacto. – pako

+0

Creo que para eso querrías usar ''/ \ P {Any}/u'' -' Any' debería ser autoexplicativo, y '\ P {}' (mayúscula) es la forma negada de '\ p {} '. Pero estaría más preocupado por cómo esas secuencias de bytes inválidas entraron allí en primer lugar. –

5

Puede utilizar Unicode character properties

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

(se suman las otras clases que desea dejar pasar)

Si desea revertir Unicode a ASCII, de ninguna manera fullproof pero con algunas traducciones bonito:

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

NOTA: La URL anterior está rota y SO no me deja editar la respuesta; la URL correcta es: http://php.net/manual/en/regexp.reference.unicode.php – DOOManiac

+0

@DOOManiac: OK, gracias por señalarlo, corrigió la URL. – Wrikken

Cuestiones relacionadas