Lorsque vous utilisez PHP pour le traitement des chaînes, la fonction MB_EREGI_REPLACE était l'un de mes outils communs. Cette fonction peut mettre en œuvre un remplacement régulier insensible à la casse des chaînes multi-octets, qui est très adapté au traitement du texte contenant des caractères multi-octets tels que le chinois. Cependant, dans l'environnement PHP 7.3+, j'ai soudainement constaté que l'utilisation de MB_EREGI_REPLACE dans le code provoquerait des avertissements ou même des erreurs. Je pensais que cette fonction avait été obsolète, mais plus tard, je l'ai étudiée en profondeur et j'ai constaté que la vérité n'était pas le cas.
En termes simples, MB_EREGI_REPLACE est une fonction fournie par l'extension MBSTring pour effectuer le remplacement de la recherche d'expressions régulières dans des chaînes de multi-gytet, et est insensible à la casse.
<?php
$original = "Hello World! hello world!";
$result = mb_eregi_replace("hello", "hi", $original);
echo $result; // Sortir:hi World! hi world!
?>
La fonction de cette fonction est très utile dans le traitement des chaînes à plusieurs octets, en particulier lorsque la correspondance de cas est requise.
Dans PHP 7.3 et plus, MB_ERGI_REPLACE invitera un avertissement similaire à ce qui suit:
Deprecated: mb_eregi_replace(): This function is deprecated
Cela a conduit de nombreux développeurs (y compris moi) à croire à tort que le responsable de PHP a obsolète cette fonction. Nous avons donc essayé d'utiliser d'autres alternatives, comme l'utilisation de MB_ERG_REPLACE avec des minuscules manuels, ou de l'utilisation de preg_replace à la place.
En fait, à partir de PHP 7.3, le moteur ordinaire sous-jacent dont dépend MB_EREGI_REPLACE a changé. Le responsable du PHP a migré le moteur ordinaire de MBREGEX à PCRE (expressions régulières compatibles Perl), et la fonction MB_ERGI_REPLACE elle-même est implémentée sur la base de MBREGEX , ce qui entraîne son mécanisme interne marqué comme déprécié, mais la fonction existe toujours.
C'est-à-dire:
La fonction n'a pas été complètement supprimée, et elle n'est officiellement marquée comme "peut être abandonnée à l'avenir", rappelant aux développeurs de faire une transition progressive;
Cela explique également pourquoi il est toujours disponible dans certaines versions PHP, mais donne un avertissement;
L'état de maintenance de la bibliothèque régulière MBREGEX sous-jacent se détériore et n'est plus recommandé.
Étant donné que MB_EREGI_REPLACE présente un risque d'abandon, il est recommandé d'utiliser l'alternative suivante:
<?php
$original = "Hello monde! hello monde!";
$pattern = "/hello/u"; // u Les modificateurs prennent en charge les multipytes,i Les modificateurs sont insensibles à la casse
$result = preg_replace($pattern . "i", "hi", $original);
echo $result; // Sortir:hi monde! hi monde!
?>
Le point ici est:
Le modificateur U garantit que les expressions régulières sont traitées dans les multipustes UTF-8;
L'implémentation du modificateur I ignore le cas;
Preg_replace est une fonction de remplacement ordinaire moderne officiellement recommandée par PHP.
PHP 8.0 a ajouté MB_STR_IREPLACE , qui est une fonction de remplacement de chaîne insensible à la casse multi-octet. La syntaxe est simple:
<?php
$original = "Hello monde! hello monde!";
$result = mb_str_ireplace("hello", "hi", $original);
echo $result; // Sortir:hi monde! hi monde!
?>
C'est l'alternative la plus simple si l'environnement d'exécution du projet prend en charge PHP 8.0 et plus.
MB_EREGI_REPLACE est en effet marqué comme déprécié dans PHP 7.3+, mais n'est pas complètement supprimé;
Cet abandon provient de la commutation régulière sous-jacente du moteur plutôt que de supprimer directement les fonctions;
Il est recommandé d'utiliser PREG_REPLACE avec les modificateurs U et I à la place;
Si vous pouvez passer à PHP 8.0 ou plus, vous pouvez utiliser MB_STR_IREPLACE pour le remplacer;
À l'avenir, les versions PHP peuvent complètement supprimer MB_EREGI_REPLACE , et plus le code est plus tôt, mieux c'est.
J'espère que cet article peut vous aider à clarifier la situation actuelle de MB_ERGI_REPLACE , à éviter de vous inquiéter aveuglément et d'utiliser des fonctions obsolètes et de maintenir la modernité et la stabilité du code.