Coincidencia de caracteres de letras Unicode en PCRE/PHP

Resuelto Jeff Lee asked hace 54 años • 5 respuestas

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.

Jeff Lee avatar Jan 01 '70 08:01 Jeff Lee
Aceptado

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';
NikiC avatar Feb 13 '2011 09:02 NikiC

Si deseas reemplazar Unicode old patternpor new patterndebes escribir:

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

Entonces la clave aquí es uel modificador.

Nota : Su servidor php versiondebe 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 AgreeOrNotpor 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 uel 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 umodificador. Vea el siguiente ejemplo. trabajar contigo

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

usama sulaiman avatar Oct 08 '2013 21:10 usama sulaiman