Sono i preg_functions PHP multibyte sicuro?
-
21-09-2019 - |
Domanda
Non ci sono più byte '' preg funzioni disponibili in PHP, in modo da significa che i preg_functions di default sono tutti mb sicuri? Impossibile trovare alcuna menzione nella documentazione di php.
Soluzione
PCRE supporta UTF-8 e altre codifiche Unicode, ma deve essere specificato al momento della compilazione. Dalla pagina man rel="noreferrer"> :
L'implementazione corrente di PCRE corrisponde approssimativamente con Perl 5.10, incluso il supporto per UTF-8 stringhe codificate e Unicode proprietà di categoria generale. Tuttavia, UTF-8 e il supporto Unicode deve essere esplicitamente abilitato; non è il default. Le tabelle Unicode corrispondono a Unicode versione 5.1.
PCRE 7.9 ; il sistema potrebbe avere una versione precedente.
Dando uno sguardo al PCRE lib che viene fornito con PHP 5.2, sembra che è configurato per supportare le proprietà Unicode e UTF-8. Lo stesso per il 5.3 ramo .
Altri suggerimenti
pcre supporta utf8 out of the box, vedere la documentazione per la 'u' modificatore.
Illustrazione (\ xc3 \ xA4 è la codifica utf8 per la lettera tedesca "a")
echo preg_replace('~\w~', '@', "a\xC3\xA4b");
ciò fa eco "@@ ¤ @", perché "\ xc3" e "\ xA4" sono stati trattati come simboli distinti
echo preg_replace('~\w~u', '@', "a\xC3\xA4b");
(nota La 'U') stampe "@@@", perché "\ xc3 \ xA4" sono stati trattati come una singola lettera.
No, non lo sono. Vedere la domanda preg_match e UTF-8 in PHP per esempio.
No, è necessario utilizzare il multibyte funzioni stringa come mb_ereg
Alcune delle mie funzioni preg più complicate:
(1 bis) convalidare il nome utente come alfanumerico + sottolineatura:
preg_match('/^[A-Za-z][A-Za-z0-9]*(?:_[A-Za-z0-9]+)*$/',$username)
(1b) possibile UTF alternativa:
preg_match('/^[A-Za-z][A-Za-z0-9]*(?:_[A-Za-z0-9]+)*$/u',$username)
(2a) validate e-mail:
preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix",$email))
(2b) possibile UTF alternativa:
preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ixu",$email))
(3a) normalizzare nuove righe:
preg_replace("/(\n){2,}/","\n\n",$str);
(3b) possibile UTF alternativa:
preg_replace("/(\n){2,}/u","\n\n",$str);
fare thse cambiamenti guardano bene?