utf8 regulares regular preg_match mostrar expresiones especiales caracteres acentos php regex unicode pcre character-properties

php - regulares - preg_match caracteres especiales



Coincidencia de caracteres de letras Unicode en PCRE/PHP (3)

Intento escribir un validador razonablemente permisivo para los nombres en PHP, y mi primer intento consiste en el siguiente patrón:

// unicode letters, apostrophe, hyphen, space $namePattern = "/^([//p{L}''//- ])+$/";

Esto finalmente se pasa a una llamada a preg_match() . Por lo que puedo decir, esto funciona con su alfabeto ASCII vainilla, pero parece tropezar con caracteres más picantes como Ă o 张.

¿Hay algo mal con el patrón en sí? Tal vez estoy esperando /p{L} para hacer más trabajo de lo que creo.

¿O tiene algo que ver con la forma en que se transmite la entrada? No estoy seguro de si es relevante, pero me aseguré de especificar una codificación UTF8 en la página del formulario.


Creo que el problema es mucho más simple que eso: olvidó especificar el modificador u . Las propiedades de caracteres Unicode solo están disponibles en el modo UTF-8 .

Su expresión regular debería ser:

// unicode letters, apostrophe, hyphen, space $namePattern = ''/^[-/' /p{L}]+$/u'';


En primer lugar, su vida sería mucho más fácil si utilizara apóstrofos individuales en lugar de comillas dobles al escribir estos; solo necesita una barra invertida. En segundo lugar, la combinación de marcas /pM también debe incluirse. Si encuentra un personaje que no coincide, descubra su punto de código Unicode y luego puede usar http://www.fileformat.info/info/unicode/ para descubrir dónde está. Encontré http://hsivonen.iki.fi/php-utf8/ una herramienta invaluable al realizar la depuración con propiedades UTF-8 (no olvide convertir a hexadecimal antes de intentar buscar: array_map(''dechex'', utf8ToUnicode($text)) ).

Por ejemplo, Ă resulta ser http://www.fileformat.info/info/unicode/char/0102/index.htm y estar en Lu, por lo que L debería coincidir y no coincide conmigo. El otro personaje es http://www.fileformat.info/info/unicode/char/5f20/index.htm y también es isLetter y de hecho coincide para mí. ¿Tiene compiladas las tablas de caracteres Unicode?


Si desea reemplazar el old pattern Unicode con un new pattern , debe escribir:

$text = preg_replace(''//bold pattern/b/u'', ''new pattern'', $text);

Entonces la clave aquí es tu modificador

Nota : Su php version servidor php version debe ser al menos PHP 4.3.5

como se menciona aquí php.net | Modificadores de patrones

u (PCRE_UTF8) Este modificador activa la funcionalidad adicional de PCRE que es incompatible con Perl. Las cadenas de patrones se tratan como UTF-8. Este modificador está disponible desde PHP 4.1.0 o superior en Unix y desde PHP 4.2.3 en win32. La validez UTF-8 del patrón se verifica desde PHP 4.3.5.

Gracias, AgreeOrNot que me den esa clave aquí, preg_replace, coincida con toda la palabra en árabe.

Lo intenté y funcionó en localhost pero cuando lo intenté en el servidor remoto no funcionó, entonces encontré que php.net comenzó a usar el modificador u en PHP 4.3.5. , Actualizo la versión de php y funciona

Es importante saber que este método es muy útil para los usuarios árabes (عربي) porque, como creo, el unicode es la mejor codificación para el idioma árabe, y el reemplazo no funcionará si no usas el modificador u , mira el siguiente ejemplo debería trabajar contigo

$text = preg_replace(''//bمرحبا بك/b/u'', ''NEW'', $text);