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
Libérer: 2024-12-06 05:35:19
original
177 Les gens l'ont consulté

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
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal