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