Sind die PHP preg_functions multibyte sicher?
-
21-09-2019 - |
Frage
Es gibt keine Multibyte ‚Preg‘ verfügbaren Funktionen in PHP, so bedeutet das, dass die Standard preg_functions sind alle mb sicher? Kann keine Erwähnung in der PHP-Dokumentation finden.
Lösung
kann PCRE UTF-8 und andere Unicode-Codierung, aber es hat bei der Kompilierung angegeben werden. Von der Manpage für PCRE 8.0 :
Die aktuelle Implementierung von PCRE entspricht in etwa mit Perl 5.10, einschließlich der Unterstützung für UTF-8 kodierten Strings und Unicode allgemeine Kategorie Eigenschaften. Allerdings UTF-8 und Unicode-Unterstützung muss explizit aktiviert werden; es ist nicht der Standard. Die Unicode-Tabellen entsprechen Unicode-Release 5.1.
PHP verwendet derzeit PCRE 7.9 ; Ihr System könnte eine ältere Version besitzen.
Ein Blick auf die PCRE lib , die mit PHP 5.2 kommt, scheint es, dass es so konfiguriert Unicode Eigenschaften und UTF-8 zu unterstützen. Das Gleiche gilt für die 5.3 Zweig .
Andere Tipps
pcre unterstützt utf8 der Box, siehe Dokumentation für das 'u' Modifikator.
Illustration (\ xC3 \ XA4 ist die UTF-8-Codierung für den Deutsch Buchstaben "ä")
echo preg_replace('~\w~', '@', "a\xC3\xA4b");
Diese Echos "@@ ¤ @", weil "\ xC3" und "\ XA4" wurden als unterschiedliche Symbole behandelt
echo preg_replace('~\w~u', '@', "a\xC3\xA4b");
(beachten Sie die 'u') druckt "@@@", weil "\ xC3 \ XA4" als einzelner Buchstabe behandelt wurden.
Nein, sie sind es nicht. Sehen Sie sich die Frage preg_match und UTF-8 in PHP zum Beispiel.
Nein, müssen Sie die verwenden Multibyte-String-Funktionen wie mb_ereg
Einige meiner mehr kompliziert preg Funktionen:
(1a) Validieren Benutzername als alphanumerischer + Strich:
preg_match('/^[A-Za-z][A-Za-z0-9]*(?:_[A-Za-z0-9]+)*$/',$username)
(1b) möglich UTF Alternative:
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) möglich UTF Alternative:
preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ixu",$email))
(3a) Normalisieren newlines:
preg_replace("/(\n){2,}/","\n\n",$str);
(3b) möglich UTF Alternative:
preg_replace("/(\n){2,}/u","\n\n",$str);
Do thse Änderungen aussehen in Ordnung?