molily: Nachfrage bzgl. regExp

Beitrag lesen

Hallo,

$str = preg_replace('~([\xA0-\xFF])~e', '"=" . strtoupper(dechex(ord("$1")))', $str);

Der e-Modifier bedeutet »führe den zweiten preg_replace-Parameter bei jedem Vorkommen des Patterns als PHP-Ausdruck aus und ersetze das Vorkommen durch das Ergebnis des Ausdrucks«.

Das Muster [\xA0-\xFF] trifft auf alle Bytes mit den Werten 160 bis 255 zu. Das sind alle Nicht-ASCII-Zeichen in der Kodierung ISO-8859-1. (Achtung, die zusätzlichen Zeichen zwischen 128 und 160 in Windows-1252 werden nicht berücksichtigt! Wenn Formulardaten verarbeitet werden, muss dafür gesorgt werden, dass der Browser Eurozeichen usw. nicht Windows-1252-kodiert sendet.)

Immer wenn nun ein Zeichen mit einem solchen Bytewert gefunden wird, wird der String im zweiten preg_replace-Parameter als PHP-Ausdruck ausgewertet. Zuerst werden die Backreferences durch die jeweiligen Treffer ersetzt, dann wird der Ausdruck ausgeführt (vergleichbar mit eval()) und der Rückgabewert anstelle des gefundenen Zeichens eingesetzt.

Zur Veranschaulichung:
echo(preg_replace('~[\xA0-\xFF]~e', 'print "$0, "', 'üöä'));
print gibt immer einen Integer-Wert zurück, nämlich 1. Diese Zeile gibt also aus ü, ö, ä, 111. $0 wird durch den gesamten Treffer ersetzt, dann wird »print 'ü, '« usw. ausgeführt. Das Ergebnis dieses Ausdrucks ist der Ersatz für »ü« usw.

In »"=" . strtoupper(dechex(ord("$1")))« wird zunächst der Bytewert des gefundenen Zeichens in Erfahrung gebracht (z.B. ord('ü') ergibt 252). Dieser Bytewert - der immer dann, wenn ein String erwartet wird, automatisch in einen String mit dezimaler Schreibweise umgewandelt wird - wird in eine hexadezimale Zahl umgewandelt (z.B. ord(252) == 'fc'). Die Buchstaben dieses Hex-Wertes werden zu Großbuchstaben (z.B. 'FC') und vorne an den String wird »=« gehangen. Heraus kommt z.B. '=FC', das anstelle von »ü« eingefügt wird.

Mathias