Heim >Backend-Entwicklung >PHP-Tutorial >Wie erhalte ich den richtigen Zeichenversatz in UTF-8-Zeichenfolgen nach einem preg_match() mit PREG_OFFSET_CAPTURE?

Wie erhalte ich den richtigen Zeichenversatz in UTF-8-Zeichenfolgen nach einem preg_match() mit PREG_OFFSET_CAPTURE?

Linda Hamilton
Linda HamiltonOriginal
2024-12-03 01:01:09977Durchsuche

How to Get the Correct Character Offset in UTF-8 Strings After a preg_match() with PREG_OFFSET_CAPTURE?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn