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 ?
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.
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!