Position actuelle: Accueil> Derniers articles> Pensez-vous que MB_EREGI_REPLACE prend en charge \ p {Han}? En fait, il ne comprend pas du tout les propriétés Unicode

Pensez-vous que MB_EREGI_REPLACE prend en charge \ p {Han}? En fait, il ne comprend pas du tout les propriétés Unicode

M66 2025-06-12

Lorsque vous traitez avec des chaînes multi-gobets en PHP, nous comptons souvent sur l'extension MBSTring pour une meilleure compatibilité Unicode. En particulier, MB_EREG_REPLACE et MB_ERGI_REPLACE seraient des fonctions de remplacement régulières de plusieurs octets. De nombreux développeurs croient à tort qu'ils peuvent reconnaître les attributs Unicode tels que \ p {Han} comme PCRE, réalisant ainsi une correspondance précise des caractères chinois.

Malheureusement, cette idée est erronée.

MB_ERGI_REPLACE utilise en fait un moteur ordinaire de style POSIX

Tout d'abord, il est clair que MB_EREG_REPLACE et MB_ERG_REPLACE utilisent le moteur ordinaire en fonction de l'ouniguruma, mais le modèle de syntaxe qu'il utilise n'est pas des expressions régulières compatibles (PCRE), mais est une variante POSIX à fonction limitée plus ancienne. Bien que Oniguruma prenne elle-même la correspondance de l'attribut Unicode, la prémisse est que les modes appropriés doivent être activés (par exemple, Preg_Match prend en charge \ p {Han} dans PHP 7.3+).

Jetons un coup d'œil à un exemple de code malentendu typique:

 $text = 'C'est test contenu 123';
$result = mb_eregi_replace('\p{Han}+', '', $text);
echo $result;

Pensez-vous que ce script supprimera les caractères chinois et préservera l'anglais et les chiffres? En fait, ce n'est pas le cas. MB_ERGI_REPLACE traite \ p comme une barre oblique inverse et une lettre P , et {Han} ne sera pas du tout reconnu comme une sémantique spéciale. Cela fait que le regex est invalide et ne correspondra à aucun caractères chinois.

Véritable compréhension du support Unicode: le modificateur prég_replace + u est le roi

Pour implémenter la prise en charge des propriétés Unicode, la bonne façon de le faire est d'utiliser Preg_replace et d'ajouter le modificateur U afin que PHP puisse utiliser le mode Unicode pour interpréter les chaînes.

Voyons un exemple correct:

 $text = 'C'est test contenu 123';
$result = preg_replace('/\p{Han}+/u', '', $text);
echo $result;

Sortir:

  test  123

C'est l'effet que nous voulons vraiment.

Pourquoi les malentendus durent-ils si longtemps?

Lorsque de nombreux développeurs voient l'explication selon laquelle MB_EREGI_REPLACE a un "support multi-octets", ils pensent naturellement qu'il a la capacité de faire correspondre les attributs Unicode, en particulier de nombreux anciens tutoriels ou articles de la communauté chinoise n'ont pas précisé. Par exemple, si vous recherchez MB_EREGI_REPLACE \ P {Han} , vous pouvez trouver des explications vagues ou obsolètes, ce qui fait que les gens pensent à tort que cela est "réalisable".

De plus, si votre projet est habitué à utiliser MB_ERGI_REPLACE pour gérer les régularités, il est très susceptible de rester coincé lorsqu'il s'agit de jeux de caractères chinois ou Unicode, ce qui entraîne un filtrage incomplet de données ou des erreurs logiques, en particulier dans les tâches telles que le nettoyage de texte et l'extraction des données.

Et si vous devez utiliser MB_EREGI_REPLACE ?

Pour être honnête, vous feriez mieux d'arrêter de l'utiliser. Cependant, s'il est nécessaire de l'utiliser pour les besoins de compatibilité, vous pouvez envisager d'utiliser un codage de la gamme Unicode pour les caractères chinois:

 $text = 'C'est test contenu 123';
$result = mb_eregi_replace('[un-Rose]+', '', $text);
echo $result;

Bien que cette approche ne soit pas suffisamment précise (par exemple, elle ne peut pas correspondre à toutes les extensions de caractères chinoises), elle est au moins beaucoup plus fiable que aveuglément à l'aide de \ p {Han} . En allant plus loin, vous pouvez énumérer manuellement plusieurs intervalles de caractère chinois pour améliorer la précision, mais en fin de compte, il traitera les symptômes mais pas la cause profonde.

Une meilleure approche consiste à se tourner complètement vers Preg_Replace et à s'assurer que mbString.func_overload ou les politiques de support multi -yte appropriées sont activées, ce qui maximise la puissance du PCRE.

Résumer

N'utilisez pas mal à MB_ERGI_REPLACE ('\ p {Han}', ...) , il ne reconnaît pas du tout la syntaxe de \ p {} . Si vous devez gérer les propriétés Unicode, la seule option fiable est Preg_Replace avec le modificateur U. Ce malentendu a troublé de nombreux développeurs PHP au fil des ans, et il est temps de corriger la source.