sirve - ¿Son seguras las preg_funciones de PHP multibyte?
regex php string (5)
No hay funciones multibyte ''preg'' disponibles en PHP, ¿eso significa que las funciones preg predeterminadas son todas seguras mb? No se pudo encontrar ninguna mención en la documentación de php.
Algunas de mis funciones de preg más complicadas:
(1a) valide el nombre de usuario como alfanumérico + guión bajo:
preg_match(''/^[A-Za-z][A-Za-z0-9]*(?:_[A-Za-z0-9]+)*$/'',$username)
(1b) posible alternativa UTF:
preg_match(''/^[A-Za-z][A-Za-z0-9]*(?:_[A-Za-z0-9]+)*$/u'',$username)
(2a) validar el correo electrónico:
preg_match("/^([a-z0-9/+_/-]+)(/.[a-z0-9/+_/-]+)*@([a-z0-9/-]+/.)+[a-z]{2,6}$/ix",$email))
(2b) posible alternativa UTF:
preg_match("/^([a-z0-9/+_/-]+)(/.[a-z0-9/+_/-]+)*@([a-z0-9/-]+/.)+[a-z]{2,6}$/ixu",$email))
(3a) normalizar nuevas líneas
preg_replace("/(/n){2,}/","/n/n",$str);
(3b) posible alternativa UTF:
preg_replace("/(/n){2,}/u","/n/n",$str);
¿Estos cambios se ven bien?
No, ellos no son. Consulte la pregunta preg_match y UTF-8 en PHP, por ejemplo.
No, necesitas usar las funciones de cadenas multibyte como mb_ereg
PCRE puede admitir UTF-8 y otras codificaciones Unicode, pero debe especificarse en tiempo de compilación. Desde la página del manual para PCRE 8.0 :
La implementación actual de PCRE corresponde aproximadamente con Perl 5.10, que incluye soporte para cadenas codificadas UTF-8 y propiedades de categoría general Unicode. Sin embargo, la compatibilidad con UTF-8 y Unicode debe estar explícitamente habilitada; no es el predeterminado. Las tablas Unicode corresponden a la versión 5.1 de Unicode.
PHP actualmente usa PCRE 7.9 ; su sistema puede tener una versión anterior.
Echando un vistazo a la PCRE lib que viene con PHP 5.2, parece que está configurado para admitir propiedades Unicode y UTF-8. Lo mismo para la rama 5.3 .
pcre soporta utf8 fuera de la caja, ver la documentación para el modificador ''u''.
Ilustración (/ xC3 / xA4 es la codificación utf8 para la letra alemana "ä")
echo preg_replace(''~/w~'', ''@'', "a/xC3/xA4b");
esto se hace eco de "@@ ¤ @" porque "/ xC3" y "/ xA4" se trataron como símbolos distintos
echo preg_replace(''~/w~u'', ''@'', "a/xC3/xA4b");
(observe la ''u'') imprime "@@@" porque "/ xC3 / xA4" se trataron como una sola letra.