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

藏色散人
Libérer: 2023-03-06 10:44:01
original
3222 Les gens l'ont consulté

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

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 "地不仁"
Copier après la connexion

Solution :

Ajouter un modificateur UTF8

$d = preg_replace(&#39;/[万]/u&#39;,&#39;萬&#39;,$a);
Copier après la connexion

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

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!

Étiquettes associées:
php
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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!