2011-03-24 20 views
5

Tengo un formulario XHTML donde pido a las personas que ingresen su nombre completo. Luego coincido con preg_match() con este patrón: /^[\p{L}\s]+$/preg_match y caracteres latinos (no ingleses)?

En mi servidor local con PHP 5.2.13 (PCRE 7.9 2009-04-11) esto funciona bien. En el servidor web que ejecuta PHP 5.2.10 (PCRE 7.3 2007-08-28) no coincide cuando la cadena ingresada contiene el carácter danés en latín ø (http://www.ltg.ed.ac.uk/~richard/utf-8.cgi?input=%F8&mode=char).

¿Esto es un error? Hay un trabajo alrededor?

¡Gracias de antemano!

+1

¿Estás usando el modificador '/ u'? De lo contrario, UTF-8 es compatible desde antes de PHP 4.3. Sin embargo, el registro de cambios de PCRE indica múltiples errores en la serie 7.x. – mario

+0

¿Puedes verificar el resultado de ['preg_last_error'] (http://us.php.net/manual/en/function.preg-last-error.php)? – Charles

+0

@mario No, yo no. No estoy seguro de cómo usaría eso? Si solo agrego el modificador u, el patrón ni siquiera coincide en mi servidor local. –

Respuesta

8

Entonces, el problema es como se supone. No está utilizando el modificador /u. Esto significa que PCRE no buscará caracteres UTF-8.

En cualquier caso, esta es la forma en que debe hacerse:

var_dump(preg_match('/^[\p{L}\s]+$/u', "ø")); 

y funciona en todos mis versiones. Puede haber un error en otros, pero eso no es probable aquí.

Su problema es que esto también funciona:

var_dump(preg_match('/^[\p{L}\s]+$/', utf8_decode("ø"))); 

Tenga en cuenta que este utiliza la norma ISO-8859-1 en lugar de UTF-8, y deja fuera el modificador /u. El resultado es int(1). Obviamente PCRE interpreta el Latin-1 ø como coincidente con \p{L} cuando no está en el modo nicode /u. (La mayoría de los bytes de un byte \ xA0- \ xFF son símbolos de letras en Latin-1, y el punto de código de 8 bits es el mismo que en Unicode, así que está bien.)

Conclusión: su input es en realidad ISO-8859-1. Es por eso que accidentalmente funcionó para usted sin el /u. Cambia eso, y sé ajeno con los conjuntos de datos de entrada.

+1

¡Muchas gracias por su respuesta, Mario! Definitivamente estoy aprendiendo algo aquí, primero y más importante que he sido demasiado inconsistente con los conjuntos. –

+0

¡Ciertamente no eligió los temas más simples con eso! :} Los conjuntos son siempre confusión. PD: Dame un voto positivo o una marca de verificación si también te ayudó con tu tarea real. – mario

+0

Lo siento - Accidentalmente presioné [enter] en el medio de escribir este comentario: El modificador u no funciona. El utf8_encode() - truco (no _decode) funciona en mi servidor web, pero no localmente. Realmente quiero llegar al fondo de esto, así que espero que pueda aclarar algo para mí: todas mis tablas MySQL tienen colación latin1_danish_ci, pero mis scripts PHP están codificados usando UTF8, excepto un archivo en idioma danés codificado usando ISO Latin 1. ¿Dónde debo limpiar las cosas? ¡Gracias! –

Cuestiones relacionadas