Maison > Article > développement back-end > Problème de code tronqué chinois correspondant régulièrement à PHP
La solution aux caractères chinois tronqués correspondant régulièrement à PHP : ouvrez d'abord le fichier de code PHP ; puis ajoutez le modificateur UTF8 au fichier de code. L'instruction d'expression régulière est telle que "preg_replace('/[万]/ u. ','wan',$a);".
Recommandé : "Tutoriel vidéo PHP"
Questions spécifiques :
Lors de l'utilisation d'expressions régulières pour faire correspondre des caractères chinois dans des chaînes PHP, des caractères tronqués apparaissent
<?php echo '<h2>正则表达式匹配中文</h2><br>'; $a = '天地不仁,以万物为刍狗'; $b = preg_replace('/万/','萬',$a); echo $b; echo '<h2>加上方括号后替换结果出现乱码</h2><br>'; $c = '天地不仁,以万物为刍狗'; $d = preg_replace('/[万]/','萬',$a); echo $d; ?>
Les résultats du programme ci-dessus peuvent être consultés sur http://nyaii.com/s/ test.php. Pour une raison quelconque, des caractères tronqués apparaissent après l'ajout de crochets aux caractères chinois correspondants. Dans la même situation, tout fonctionne bien lorsqu'il est exécuté en javascript.
'天地不仁'.replace(/[天]/,'') //outputs "地不仁"
Solution :
Ajouter un modificateur UTF8
$d = preg_replace('/[万]/u','萬',$a);
Voir
pour d'autres modificateurs
http://php.net/manual/en/reference.pcre.pattern.modifiers.php
Ce qui suit est un contenu supplémentaire aux questions dans le commentaire du sujet
Concernant la question pourquoi le modificateur u doit être ajouté dans [], en fait, à proprement parler, il est préférable d'ajouter le modificateur u dans les deux situations
Mais pourquoi [] provoque-t-il des caractères tronqués Cela doit être expliqué ? à partir du niveau octet plutôt que du niveau caractère.
Tout d'abord, nous savons que les chaînes PHP ne sont pas stockées en Unicode, puis jetons un œil à ce code
<?php $a = "万"; echo strlen($a); //3 for ($i = 0; $i < strlen($a); $i++) { echo dechex(ord($a[$i])) . ' '; //e4 b8 87 }
Nous pouvons obtenir l'encodage hexadécimal utf8 de "10 000" mots e4b887
Ainsi, lorsque le modificateur utf8 n'est pas activé, le moteur d'expression régulière ne traite pas "dix mille" comme un caractère indépendant, mais comme trois octets de données continues.
Voici la conclusion :
Lorsqu'il n'y a pas de [] correspondant, il recherche trois caractères consécutifs avec une valeur de codage hexadécimal de e4 b8 87. En d'autres termes, le réel Votre modèle est xe4xb8x87, mais lorsque de tels caractères consécutifs apparaissent dans votre chaîne, seul le mot « dix mille » peut correspondre, il n'y aura donc aucun caractère tronqué après le remplacement. Mais si votre chaîne peut également inclure des caractères codés en utf8 sur quatre octets, tels que des emoji, cela peut causer des problèmes
Lorsque vous enveloppez [] en dehors des 10 000, le moteur d'expression régulière en fait. Ce que je recherche est [xe4xb8x87 ] Ceux qui comprennent les expressions régulières découvriront rapidement qu'elles correspondent réellement à l'un de ces trois caractères, donc pour le moment, cela affectera d'autres caractères chinois sauf dix mille
Lorsque vous ajoutez le modificateur utf8, "wan" sera traité comme un caractère indépendant par l'expression régulière, donc ce problème ne se produira plus
Quant à JavaScript, car son encodage de caractères est unicode natif, chaque caractère sera traité comme un caractère au lieu d'être divisé en octets données, donc ce problème ne se produira pas
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!