2010-02-28 27 views
6

tengo una sencilla expresión regular para comprobar un nombre de usuario:caracteres que coincida con UTF con preg_match en PHP: (* UTF8) Funciona en Windows, pero no Linux

preg_match('/(*UTF8)^[[:alnum:]]([[:alnum:]]|[ _.-])+$/i', $username); 

En pruebas locales (Windows 7 usando WAMP), este permitirá nombres de usuario usando caracteres UTF (como é o ñ). Sin embargo, cuando me traslado a prueba esta en el servidor donde realmente se encuentra alojada la web, me sale el siguiente aviso:

Advertencia: preg_match() [function.preg-match]: Compilación falló: (* VERBO) no se reconoce en el desplazamiento 5 en /home/sites/vgmusic.com/test/Core/Impl/FormElementValidator.php en la línea 12

también he intentado esto en una instalación local de Ubuntu y obtener el mismo error. De hecho, solo he visto este trabajo en mi entorno de desarrollo local. ¿Hay alguna manera de permitir caracteres especiales que funcionarán para todos los sistemas operativos?

+0

¿Qué esperas que '(* UTF8)' haga? – Gumbo

+0

Bueno, antes de agregarlo, lo anterior devolvería falso cuando se ingresara un carácter como é. Después de agregarlo, esos caracteres fueron aceptados y lo anterior se devolvió verdadero. Esperaba que permitiera dichos personajes. – Scott

+0

Esto es casi seguro hasta las versiones de PHP. ¿Qué versiones de PHP estás ejecutando? ¿Las páginas de phpinfo() contienen información sobre las versiones de PCRE? –

Respuesta

14

probar por su descripción de los personajes por su Unicode character properties:

preg_match('/^\p{L}[\p{L} _.-]+$/u', $username) 
+1

Se ve bien. Creo que lo siguiente también permitirá números como el ejemplo original: 'preg_match ('/^(\ p {L} | \ p {N}) [(\ p {L} | \ p {N}) _ .-] + $/u ', $ username) ' – Scott

+0

@S. DePouw, haz ese ''/^[\ p {L} \ p {N}] [\ p {L} \ p {N} _.-] + $/u''. Dentro de una clase de caracteres, '(', ')' y '|' solo coinciden con '(', ')' y '|'. –

2

yo ya había estado tratando con el parámetro /u mencionado. En Windows (PHP 5.2.16), agregar el parámetro /u funcionó bien para capturar una cadena que contenía caracteres Unicode, sin embargo, en CentOS 5 y PHP 5.2.16 aún no podía capturar una cadena que contenía caracteres Unicode, usando .* (preg_match básicamente no se pudo capturar).

Después de mucho tiempo sin llegar a ninguna parte, jugando con la configuración 'LOCALE' que no cambió nada, finalmente encontré this site.

Hice un rpm -Uvh de la versión apropiada de rpm provista, reinicié Apache, ¡y de repente mis expresiones regulares funcionó de maravilla!

Aunque inicialmente tenía compatibilidad con UTF-8, mis expresiones regulares no capturaban cadenas de caracteres unicode hasta que instalé las rpm actualizadas, que también agrega "Soporte de propiedades Unicode". Pensé que tener soporte para UTF-8 hubiera sido suficiente, pero aparentemente no.

1

parece que es una publicación anterior pero como siempre es un tema de interés, publicaré lo que descubrí here. Es una pequeña diferencia, pero hace que el código sea más simple. Lo que pasa es que las llaves son opcionales.

El código anterior de Gumbo y Scott se puede escribir más simple como esto si alguien quiere permitir sólo letras (Unicode & no Unicode) y espacios en blanco:

preg_match("/^\pL[\pL ]+$/u",$string) 

También he notado que preg_match acepta incluso código más simple como el siguiente:

preg_match("/^[\pL ]+$/u",$string) 
Cuestiones relacionadas