当前位置: 首页> 最新文章列表> 在 PHP 7.3+ 中误以为 mb_eregi_replace 已弃用

在 PHP 7.3+ 中误以为 mb_eregi_replace 已弃用

M66 2025-06-05

在使用 PHP 进行字符串处理时,mb_eregi_replace 函数曾经是我常用的工具之一。这个函数能够实现多字节字符串的正则不区分大小写替换,非常适合处理含有中文等多字节字符的文本。可是在 PHP 7.3+ 的环境下,我突然发现代码中使用 mb_eregi_replace 会出现警告甚至错误,原以为这个函数已经被弃用了,后来深入研究才发现真相并非如此。


什么是 mb_eregi_replace

简单来说,mb_eregi_replacembstring 扩展提供的一个函数,用于在多字节字符串中执行正则表达式的搜索替换,且不区分大小写。

<?php
$original = "Hello World! hello world!";
$result = mb_eregi_replace("hello", "hi", $original);
echo $result; // 输出:hi World! hi world!
?>

这个函数的功能在多字节字符串处理中非常有用,尤其是需要忽略大小写匹配的时候。


为什么以为 mb_eregi_replace 在 PHP 7.3+ 被弃用?

在 PHP 7.3 及以上版本,mb_eregi_replace 会提示类似如下警告:

Deprecated: mb_eregi_replace(): This function is deprecated

这让很多开发者(包括我)误以为 PHP 官方已经弃用了这个函数。于是纷纷尝试用其它替代方案,比如用 mb_ereg_replace 加上手动转小写,或者用 preg_replace 代替。


事实真相:mb_eregi_replace 并非彻底废弃,而是依赖底层组件

实际上,从 PHP 7.3 开始,mb_eregi_replace 依赖的底层正则引擎发生了变化。PHP 官方将正则引擎从 mbregex 迁移到了 PCRE (Perl Compatible Regular Expressions),而 mb_eregi_replace 函数本身基于 mbregex 实现,导致其内部机制被标记为废弃(deprecated),但函数仍然存在。

也就是说:

  • 函数未被完全移除,仅仅是官方标记为“将来可能废弃”,提醒开发者逐步过渡;

  • 这也解释了为什么它在某些 PHP 版本中还可用,但会发出警告;

  • 底层的 mbregex 正则库维护状态变差,不再推荐使用。


推荐的替代方案

既然 mb_eregi_replace 有废弃风险,推荐使用以下方案替代:

使用 preg_replace 配合 ui 修饰符

<?php
$original = "Hello 世界! hello 世界!";
$pattern = "/hello/u";   // u 修饰符支持多字节,i 修饰符不区分大小写
$result = preg_replace($pattern . "i", "hi", $original);
echo $result; // 输出:hi 世界! hi 世界!
?>

这里的重点是:

  • u 修饰符保证正则表达式按 UTF-8 多字节处理;

  • i 修饰符实现忽略大小写;

  • preg_replace 是 PHP 官方推荐的现代正则替换函数。

使用 mb_str_ireplace (PHP 8.0+ 支持)

PHP 8.0 新增了 mb_str_ireplace,这是个多字节不区分大小写的字符串替换函数,语法简单:

<?php
$original = "Hello 世界! hello 世界!";
$result = mb_str_ireplace("hello", "hi", $original);
echo $result; // 输出:hi 世界! hi 世界!
?>

如果项目运行环境支持 PHP 8.0 及以上,这是最简洁的替代方法。


总结

  • mb_eregi_replace 在 PHP 7.3+ 确实被标记为废弃,但并未完全移除;

  • 这种废弃源自底层正则引擎切换,而非直接移除函数;

  • 建议使用 preg_replace 搭配 ui 修饰符进行替代;

  • 如果可升级到 PHP 8.0 及以上,可以用 mb_str_ireplace 取代;

  • 未来 PHP 版本可能完全移除 mb_eregi_replace,代码迁移越早越好。

希望这篇文章能帮你理清 mb_eregi_replace 的现状,避免盲目担心和使用过时函数,保持代码的现代性和稳定性。