Der Martin: Regulärer Ausdruck mit [[:cntrl:]] erfasst chinesische Zeichen

Beitrag lesen

Moin,

in einem Script werden Nutzereingaben - insbesondere der Nutzername - nach unerwünschten Zeichen durchsucht. Unerwünscht sind u.a. (nicht-druckbare) Steuerzeichen, die mit folgendem Ausdruck detektiert werden sollen:

preg_match("/([[:cntrl:]]|\255)/", $string)

bedenke, dass die String- und Regex-Funktionen von PHP genaugenommen von Haus aus nicht Zeichen, sondern Bytes verarbeiten. Es ist daher wichtig zu wissen, in welcher Codierung deine Eingabedaten vorliegen. Naheliegend wäre UTF-8, aber ich kann nur mutmaßen.

Problematisch wird es, wenn die Zeichenkette auch chinesische Schriftzeichen enthält bspw. 测试汉语, da diese als Steuerzeichen erkennt werden.

Das heißt, die Byte-Darstellung dieser Zeichen enthält irgendwo einen der Bytewerte 0x00 .. 0x1F, 0xFF oder 0x7F (gehört AFAIR zu :cntrl: dazu).

Was muss ich mir unter einem nicht-druckbaren Zeichen vorstellen mit Hinblick auf die genannte Zeichenfolge? Wie könnte ein Ausdruck aussehen, der weniger aggressiv bzgl. chinesischer Zeichen ist aber gleichzeitig nicht-druckbare Zeichen detektiert?

Wenn du tatsächlich Eingabedaten in UTF-8 hast, solltest du IMO den Modifier u verwenden, um die Regex-Engine von PHP ebenfalls auf UTF-8 einzustellen.

So long,
 Martin

--
Es gibt eine Theorie, die besagt, dass das Universum augenblicklich durch etwas noch Komplizierteres und Verrücktes ersetzt wird, sobald jemand herausfindet, wie es wirklich funktioniert. Es gibt eine weitere Theorie, derzufolge das bereits geschehen ist.
- (frei übersetzt nach Douglas Adams)