Maison  >  Article  >  développement back-end  >  Problème de code tronqué chinois correspondant régulièrement à PHP

Problème de code tronqué chinois correspondant régulièrement à PHP

藏色散人
藏色散人original
2020-09-30 09:38:143250parcourir

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);".

Problème de code tronqué chinois correspondant régulièrement à PHP

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 &#39;<h2>正则表达式匹配中文</h2><br>&#39;;
$a = &#39;天地不仁,以万物为刍狗&#39;;
$b = preg_replace(&#39;/万/&#39;,&#39;萬&#39;,$a);
echo $b;
echo &#39;<h2>加上方括号后替换结果出现乱码</h2><br>&#39;;
$c = &#39;天地不仁,以万物为刍狗&#39;;
$d = preg_replace(&#39;/[万]/&#39;,&#39;萬&#39;,$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.

 &#39;天地不仁&#39;.replace(/[天]/,&#39;&#39;)
 //outputs "地不仁"

Solution :

Ajouter un modificateur UTF8

$d = preg_replace(&#39;/[万]/u&#39;,&#39;萬&#39;,$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])) . &#39; &#39;; //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!

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