Position actuelle: Accueil> Derniers articles> Comment prétraiter les caractères illégaux dans les chaînes avant d'utiliser la fonction MB_EREGI_REPLACE pour éviter une défaillance régulière?

Comment prétraiter les caractères illégaux dans les chaînes avant d'utiliser la fonction MB_EREGI_REPLACE pour éviter une défaillance régulière?

M66 2025-06-15

Dans PHP, la fonction MB_EREGI_REPLACE est utilisée pour effectuer un remplacement régulier de caractères multi -yte et ignorer le cas. Il est très utile pour gérer les chaînes codées de mulabyte telles que l'UTF-8. Cependant, dans une utilisation réelle, si la chaîne d'entrée contient des caractères illégaux (tels que les caractères spéciaux des expressions régulières ne sont pas échappés), cela conduira souvent à une défaillance de correspondance régulière ou à des rapports d'erreur.

Cet article présentera comment prétraiter les chaînes avant d'utiliser la fonction MB_EREGI_REPLACE pour éviter le problème de l'échec de l'expression régulière en raison de caractères illégaux.


1. Problème Contexte

Le premier paramètre de MB_EREGI_REPLACE est un modèle d'expression régulière, le deuxième paramètre est le contenu de remplacement et le troisième paramètre est la chaîne à traiter.

Exemple:

 <?php
$text = "Hello World!";
$pattern = "world";
$replacement = "PHP";

echo mb_eregi_replace($pattern, $replacement, $text);
?>

La sortie est:

 Hello PHP!

Mais lorsque $ motif ou en attente de chaîne contient des caractères spéciaux non recommandés, le match peut échouer et même un avertissement est lancé.


2. Caractères illégaux qui peuvent provoquer une défaillance régulière

Les personnages ayant une signification particulière dans les expressions régulières comprennent:

 . \ + * ? [ ^ ] $ ( ) { } = ! < > | : -

Si ces caractères apparaissent dans le motif ou dans la chaîne à remplacer, ils doivent être échappés correctement.


3. Étapes de prétraitement

3.1 Échapper aux caractères spéciaux réguliers

La propre fonction de PHP preg_quote () peut échapper aux caractères spéciaux dans des expressions régulières. Mais MB_EREGI_REPLACE utilise la régularité de l'extension MBregex , pas le PCRE PREG_ * SERIE, et les règles d'échappement sont légèrement différentes, mais généralement PREG_QUOTE s'échappe la plupart des caractères spéciaux sont toujours valides.

Exemple:

 <?php
$pattern_raw = "hello.world"; // . C&#39;est un personnage spécial
$pattern = preg_quote($pattern_raw, '/'); // S&#39;échapper hello\.world

$text = "Hello World! hello.world test.";

echo mb_eregi_replace($pattern, "PHP", $text);
?>

Sortir:

 Hello World! PHP test.

3.2 Filtre ou remplacer les caractères illégaux

Si vous craignez que les chaînes qui sont en attente contiennent des caractères de contrôle (tels que des caractères non imprimés) qui font échouer le match, vous pouvez les filtrer avec régularité d'abord:

 <?php
// Supprimer les caractères non imprimés,Seuls les caractères communs et les chinois sont préservés
$clean_text = preg_replace('/[^\P{C}\n]+/u', '', $text);

4. Exemple complet

L'exemple suivant montre comment échapper aux caractères spéciaux dans le motif avant d'appeler MB_ERGI_REPLACE et les caractères illégaux de prétraitement dans la chaîne à remplacer:

 <?php
// Cordes et motifs qui doivent être remplacés
$pattern_raw = "foo.bar?"; // Contient des caractères spéciaux . et ?
$replacement = "PHP";
$text = "Hello foo.bar? world! \x01\x02"; // Inclure les caractères de contrôle

// 1. Caractères spéciaux en mode d&#39;échappement
$pattern = preg_quote($pattern_raw, '/');

// 2. Texte prétraité,Supprimer les caractères de contrôle
$clean_text = preg_replace('/[^\P{C}\n]+/u', '', $text);

// 3. utilisermb_eregi_replaceFaire un remplacement(Ignorer le cas)
$result = mb_eregi_replace($pattern, $replacement, $clean_text);

echo $result;
?>

Sortir: