Maison >développement back-end >tutoriel php >Pourquoi les décalages preg_match() sont-ils en octets, pas en caractères, même avec le support UTF-8 ?

Pourquoi les décalages preg_match() sont-ils en octets, pas en caractères, même avec le support UTF-8 ?

DDD
DDDoriginal
2024-12-06 05:35:19159parcourir

Why are preg_match() Offsets in Bytes, Not Characters, Even with UTF-8 Support?

PREG_OFFSET_CAPTURE et chaînes UTF-8 : une incompatibilité de comptage d'octets

Lors de la mise en correspondance de chaînes UTF-8 à l'aide de preg_match() avec le paramètre PREG_OFFSET_CAPTURE, les utilisateurs peuvent rencontrer un problème inattendu comportement où les décalages sont comptés en octets au lieu de caractères. Malgré l'utilisation du modificateur u, qui active la prise en charge de l'UTF-8 pour le motif et le sujet, les décalages capturés restent basés sur les octets.

Résoudre le problème de comptage d'octets

Pour résoudre cet écart et obtenir décalages basés sur les caractères, une solution de contournement impliquant mb_strlen peut être utilisée. Cette fonction fournit le nombre de caractères UTF-8 pour une sous-chaîne spécifiée. En utilisant mb_strlen sur la sous-chaîne de la chaîne sujet précédant la correspondance capturée, nous pouvons obtenir le décalage de caractère précis.

Voici un exemple modifié :

$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

En incorporant mb_strlen, nous garantissons que les décalages représentent les positions des caractères dans la chaîne UTF-8, fournissant un résultat précis et attendu.

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