Beim Abgleichen von UTF-8-Strings mithilfe von preg_match() mit dem PREG_OFFSET_CAPTURE-Parameter können Benutzer auf ein unerwartetes Problem stoßen Verhalten, bei dem Offsets in Bytes statt in Zeichen gezählt werden. Trotz der Verwendung des u-Modifikators, der UTF-8-Unterstützung sowohl für das Muster als auch für den Betreff ermöglicht, bleiben erfasste Offsets bytebasiert.
Um diese Diskrepanz zu beheben und zu erhalten Bei zeichenbasierten Offsets kann ein Workaround mit mb_strlen eingesetzt werden. Diese Funktion stellt die UTF-8-Zeichenanzahl für eine angegebene Teilzeichenfolge bereit. Durch die Verwendung von mb_strlen für die Teilzeichenfolge der Betreffzeichenfolge vor der erfassten Übereinstimmung können wir den genauen Zeichenversatz ermitteln.
Hier ist ein modifiziertes Beispiel:
$str = "\xC2\xA1Hola!"; preg_match('/H/u', $str, $a_matches, PREG_OFFSET_CAPTURE); echo mb_strlen(substr($str, 0, $a_matches[0][1])); // Outputs 1
Durch die Einbindung von mb_strlen stellen wir dies sicher Offsets stellen Zeichenpositionen innerhalb der UTF-8-Zeichenfolge dar und liefern ein präzises und erwartetes Ergebnis.
Das obige ist der detaillierte Inhalt vonWarum werden preg_match()-Offsets in Bytes und nicht in Zeichen angegeben, selbst mit UTF-8-Unterstützung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!