Son los preg_functions PHP multibyte seguro?
-
21-09-2019 - |
Pregunta
No hay varios bytes '' preg funciones disponibles en PHP, por lo que ¿significa que los preg_functions por defecto son todos mb seguro? No se pudo encontrar ninguna mención en la documentación de PHP.
Solución
PCRE puede soportar UTF-8 y otras codificaciones Unicode, pero tiene que ser especificado en tiempo de compilación. Desde la página del rel="noreferrer"> :
La implementación actual de PCRE corresponde aproximadamente con Perl 5.10, incluyendo soporte para UTF-8 cadenas codificadas y Unicode propiedades categoría general. Sin embargo, UTF-8 y el soporte Unicode tiene que ser activado de forma explícita; no es el predeterminado. Las tablas Unicode corresponden a Unicode versión 5.1.
PHP utiliza actualmente PCRE 7.9 ; el sistema podría tener una versión anterior.
Echando un vistazo a la PCRE lib que viene con PHP 5.2, parece que está configurado para soportar propiedades Unicode y UTF-8. Lo mismo para el 5.3 rama .
Otros consejos
pcre soporta UTF-8 fuera de la caja, véase la documentación de la 'U' modificador.
Ilustración (\ xc3 \ XA4 es la codificación UTF-8 para la letra alemana "A")
echo preg_replace('~\w~', '@', "a\xC3\xA4b");
este eco "@@ ¤ @" porque "\ XC3" y "\ XA4" fueron tratados como símbolos distintos
echo preg_replace('~\w~u', '@', "a\xC3\xA4b");
(tenga en cuenta las 'U') impresiones "@@@" porque "\ xc3 \ XA4" fueron tratados como una sola letra.
No, no lo son. Ver la pregunta preg_match y UTF-8 en PHP por ejemplo.
No, es necesario utilizar el multibyte funciones de cadena como mb_ereg
Algunos de mis funciones preg más complicados:
(1a) validar nombre de usuario como alfanumérico + subrayado:
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) de correo electrónico de validación:
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 saltos de línea:
preg_replace("/(\n){2,}/","\n\n",$str);
(3b) posible alternativa UTF:
preg_replace("/(\n){2,}/u","\n\n",$str);
Haz thse cambios se ven bien?