Erhalten Sie die Anzahl der Multibyte-Zeichen vor dem Abgleich mit preg_match()
Problem:
Bei der Ausführung eine reguläre Ausdrucksübereinstimmung mit einer UTF-8-codierten Zeichenfolge unter Verwendung von preg_match() mit dem Parameter PREG_OFFSET_CAPTURE, dem resultierenden Offset wird in Bytes berechnet, nicht in der Zeichenanzahl. Dies kann beim Abgleichen von Multibyte-Zeichen problematisch sein, da ihre Bytelänge von ihrer Zeichenlänge abweichen kann.
Wenn Sie beispielsweise den folgenden Code verwenden, um das „H“-Zeichen in einer UTF-8-codierten Zeichenfolge abzugleichen, wird das Ergebnis angezeigt Der Offset ist 2, obwohl das Zeichen „H“ am Index steht 1:
$str = "\xC2\xA1Hola!"; preg_match('/H/u', $str, $a_matches, PREG_OFFSET_CAPTURE); echo $a_matches[0][1];
Lösung:
Um den korrekten Zeichenanzahl-Offset zu erhalten, verwenden Sie mb_strlen(), um die Länge der Teilzeichenfolge bis zur Übereinstimmung zu bestimmen:
$str = "\xC2\xA1Hola!"; preg_match('/H/u', $str, $a_matches, PREG_OFFSET_CAPTURE); echo mb_strlen(substr($str, 0, $a_matches[0][1]));
Dadurch wird der Offset in UTF-8-Zeichen berechnet und liefert das korrekte Ergebnis.
Das obige ist der detaillierte Inhalt vonWie erhalte ich den richtigen Zeichenversatz in UTF-8-Zeichenfolgen nach einem preg_match() mit PREG_OFFSET_CAPTURE?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!