PREG_OFFSET_CAPTURE und Multibyte-Zeichen: Zähldiskrepanzen überwinden
Bei Verwendung von preg_match() mit dem u-Modifikator werden sowohl das Muster als auch der Betreff als interpretiert UTF-8-kodiert. Allerdings werden die erfassten Offsets auch mit diesem Modifikator weiterhin in Bytes gezählt. Diese Diskrepanz kann zu Verwirrung führen, wenn UTF-8-zeichenbasierte Indizes erwartet werden.
PHPs Art, Bytes in PREG_OFFSET_CAPTURE zu zählen
Obwohl preg_match() Unicode-Zeichen behandelt, PREG_OFFSET_CAPTURE wird weiterhin mit einem Byte-Zählmechanismus implementiert. Dies bedeutet, dass Zeichen mit Multibyte-Darstellungen, wie z. B. UTF-8, als einzelne Bytes und nicht als zusammengesetzte Zeichen gezählt werden.
Lösung: Verwendung von mb_strlen
Um das entsprechende zu erhalten Um zeichenbasierte Indizes in UTF-8-Strings zu erstellen, können Sie die Funktion mb_strlen() nutzen. Diese Funktion kann die Länge einer UTF-8-Zeichenfolge in Zeichen bereitstellen. Indem Sie dies in Ihren Code integrieren, können Sie den bytebasierten Offset von PREG_OFFSET_CAPTURE in den entsprechenden UTF-8-Zeichenindex übersetzen:
$str = "\xC2\xA1Hola!"; preg_match('/H/u', $str, $a_matches, PREG_OFFSET_CAPTURE); echo mb_strlen(substr($str, 0, $a_matches[0][1])); // Output: 1
In diesem Beispiel berechnet mb_strlen() die Zeichenlänge der Zeichenfolge nach oben auf den von PREG_OFFSET_CAPTURE erhaltenen Offset und stellt so den korrekten UTF-8-Index bereit. Diese Problemumgehung gewährleistet eine genaue Zeichenzählung, wie es bei der Arbeit mit Unicode-Zeichenfolgen erwartet wird.
Das obige ist der detaillierte Inhalt vonWie kann ich UTF-8-Zeichenoffsets mit PHPs „preg_match()' und „PREG_OFFSET_CAPTURE' korrekt verarbeiten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!