Coincidencia de caracteres de letras Unicode en PCRE/PHP
Estoy intentando escribir un validador razonablemente permisivo para 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()
. Hasta donde puedo decir, esto funciona con su alfabeto ASCII básico, pero parece fallar con caracteres más picantes como Ă o 张.
¿Hay algún problema con el patrón en sí? ¿ Quizás espero \p{L}
hacer más trabajo del que creo?
¿O tiene algo que ver con la forma en que se pasan las entradas? 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: olvidaste especificar el u
modificador . Las propiedades de los caracteres Unicode solo están disponibles en modo UTF-8 .
Tu expresión regular debería ser:
// unicode letters, apostrophe, hyphen, space
$namePattern = '/^[-\' \p{L}]+$/u';
Si deseas reemplazar Unicode old pattern
por new pattern
debes escribir:
$text = preg_replace('/\bold pattern\b/u', 'new pattern', $text);
Entonces la clave aquí es u
el modificador.
Nota : Su servidor php version
debe tener al menosPHP 4.3.5
como se menciona aquí php.net | Modificadores de patrón
u (PCRE_UTF8) Este modificador activa una 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 comprueba desde PHP 4.3.5.
Gracias AgreeOrNot
por darme esa clave aquí preg_replace coincide con la palabra completa en árabe
Lo probé y funcionó en localhost, pero cuando lo probé en el servidor remoto no funcionó, luego encontré que php.net comienza a usar u
el modificador 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 de árabe (عربي) porque, según creo, Unicode es la mejor codificación para el idioma árabe y el reemplazo no funcionará si no usa el u
modificador. Vea el siguiente ejemplo. trabajar contigo
$text = preg_replace('/\bمرحبا بك\b/u', 'NEW', $text);