Maison >développement back-end >tutoriel php >Comment obtenir le décalage de caractères correct dans les chaînes UTF-8 après un preg_match() avec PREG_OFFSET_CAPTURE ?

Comment obtenir le décalage de caractères correct dans les chaînes UTF-8 après un preg_match() avec PREG_OFFSET_CAPTURE ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-03 01:01:09977parcourir

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

Obtenir le nombre de caractères multi-octets avant la correspondance avec preg_match()

Problème :

Lors de l'exécution une correspondance d'expression régulière sur une chaîne codée en UTF-8 à l'aide de preg_match() avec le paramètre PREG_OFFSET_CAPTURE, le le décalage résultant est calculé en octets et non en nombre de caractères. Cela peut être problématique lors de la correspondance de caractères multi-octets, car leur longueur en octets peut différer de leur longueur de caractère.

Par exemple, en utilisant le code suivant pour faire correspondre le caractère « H » dans une chaîne codée en UTF-8, le résultat offset est 2, même si le caractère "H" est à l'index 1 :

$str = "\xC2\xA1Hola!";
preg_match('/H/u', $str, $a_matches, PREG_OFFSET_CAPTURE);
echo $a_matches[0][1];

Résolution :

Pour obtenir le décalage correct du nombre de caractères, utilisez mb_strlen() pour déterminer la longueur de la sous-chaîne jusqu'à la correspondance :

$str = "\xC2\xA1Hola!";
preg_match('/H/u', $str, $a_matches, PREG_OFFSET_CAPTURE);
echo mb_strlen(substr($str, 0, $a_matches[0][1]));

Cela calculera le décalage en caractères UTF-8, fournissant le résultat correct.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn