Position actuelle: Accueil> Derniers articles> Remplacement non valide en raison de ne pas utiliser de syntaxe régulière correcte dans le motif

Remplacement non valide en raison de ne pas utiliser de syntaxe régulière correcte dans le motif

M66 2025-05-27

Dans PHP, la fonction MB_EREGI_REPLACE est utilisée pour effectuer des opérations de remplacement d'expression régulières multi-octes insensibles à des cas. Il fait partie de l'extension MBSTRING conçue spécifiquement pour les chaînes codées à multitude (comme UTF-8). Par rapport à Eregi_replace traditionnel, MB_ERGI_REPLACE convient plus à la gestion des personnages multi-octets tels que le chinois, le japonais et le coréen.

Cependant, de nombreux développeurs rencontrent le problème du remplacement non valide lors de l'utilisation de MB_EREGI_REPLACE , et la cause profonde est que la syntaxe régulière correcte n'est pas utilisée dans le modèle d'expression régulière. Cet article expliquera pourquoi les modèles non standard peuvent provoquer des défaillances de remplacement de la syntaxe d'expression régulière et des détails d'utilisation de MB_EREGI_REPLACE .


Introduction à la fonction MB_EREGI_REPLACE

La définition de la fonction est la suivante:

 string mb_eregi_replace ( string $pattern , string $replacement , string $string [, string $option = "msr" ] )
  • $ Pattern : une expression régulière pour l'appariement, insensible à la casse.

  • $ Remplacement : chaîne remplacée.

  • $ String : une chaîne en attente.

  • $ Option : le modificateur de l'expression régulière, par défaut "MSR".

Il utilise le moteur ordinaire multi-octe de MBSTRING en interne, donc la syntaxe et le PCRE réguliers ( Preg_ * ) sont légèrement différents.


Raisons du remplacement non valide en raison de problèmes de syntaxe de motifs réguliers

  1. La syntaxe PCRE n'est pas prise en charge

MB_EREGI_REPLACE utilise le moteur ordinaire MBREGEX, pas le pcre. De nombreux développeurs sont habitués à utiliser la syntaxe PCRE (comme l'utilisation / modèle / i pour ignorer le cas), tandis que le modèle $ de MB_ERGI_REPLACE ne peut pas contenir des séparateurs de style PCRE / , et ne prend pas en charge certaines fonctionnalités de syntaxe PCRE.

Exemple d'erreur:

 mb_eregi_replace('/abc/', 'xyz', $str);

L'utilisation correcte doit être:

 mb_eregi_replace('abc', 'xyz', $str);

Il n'est pas nécessaire d'ajouter / délimiter et de modificateurs, car MB_EREGI_REPLACE lui-même est insensible à la casse.

  1. Personnages d'échappement incorrects

Dans MBREGEX, certains caractères spéciaux et méthodes d'échappement sont différents de PCRE. Par exemple, l'utilisation de \ D pour représenter les classes numériques peut ne pas être prise en charge et [0-9] doit être utilisée.

Exemple d'erreur:

 mb_eregi_replace('\d+', 'nombre', $str);

Exemple correct:

 mb_eregi_replace('[0-9]+', 'nombre', $str);
  1. Personnages multi-octets correspondant à une mauvaise utilisation

Les expressions régulières doivent s'adapter aux caractéristiques des caractères multi-octets, et si le modèle est écrit trop simplifié ou que l'hypothèse à un octet est utilisée, elle entraînera l'échec du match.


Exemples réels

Supposons que nous ayons un paragraphe:

 $str = "Hello mb_eregi_replace example with M66.net URL.";

Écriture d'erreur (à l'aide du séparateur PCRE)

 echo mb_eregi_replace('/m66\.net/', 'example.com', $str);

Cela ne sera pas remplacé avec succès car / n'est pas reconnu comme délimiteur.

Écriture correcte

 echo mb_eregi_replace('m66\.net', 'example.com', $str);

résumé

  • MB_EREGI_REPLACE ne prend pas en charge les séparateurs et modificateurs de style PCRE.

  • Des expressions régulières doivent suivre la spécification de syntaxe MBREGEX.

  • Un motif incorrect entraîne que la fonction ne correspond pas à la chaîne cible et le remplacement naturel n'est pas valide.

  • Lors de la correspondance des caractères multi-gytets, vous devez accorder plus d'attention à l'utilisation de la gamme du jeu de caractères et de la méthode d'évasion correctes.

La compréhension de la spécification de syntaxe régulière de MB_ERGI_REPLACE peut vous permettre de mieux utiliser la fonction et d'éviter de remplacer les pièges non valides.


 <?php
// Exemple de code correct:Mettez le nom de domaine dans la chaînem66.netRemplacer parexample.com

$str = "Visiter l&#39;URL:http://m66.net/path?query=1";

// Avis:mb_eregi_replaceAucun séparateur régulier requis,Cas par défaut insensible
$result = mb_eregi_replace('m66\.net', 'example.com', $str);

echo $result;  // Sortir:Visiter l&#39;URL:http://example.com/path?query=1
?>