在 PHP 7.0 及更高版本中,mb_eregi_replace() 被官方正式弃用,并在 PHP 7.1 之后彻底移除。这让很多依赖多字节字符串正则替换的开发者感到困扰。尤其是需要对 Unicode 字符串(如中文、日文等)进行不区分大小写的替换操作时,寻找一个等效且更强大的替代方案变得尤为重要。
幸运的是,PHP 的 preg_replace() 函数配合正确的修饰符和 Unicode 支持,可以实现甚至超过 mb_eregi_replace() 的功能。本文将逐步介绍如何用 preg_replace() 完美替代 mb_eregi_replace(),并实现强大的 Unicode 正则匹配。
mb_eregi_replace() 是多字节字符串扩展(mbstring)中用于不区分大小写的正则替换函数。然而,它的问题在于:
语法较旧,不支持 Perl 风格正则。
性能较差。
与现代 Unicode 处理能力有限,维护成本高。
因此,推荐使用更现代且功能丰富的 preg_replace()。
假设我们原来使用:
mb_eregi_replace("测试", "替换", $text);
我们可以这样改写为:
preg_replace("/测试/ui", "替换", $text);
这里,u 修饰符表示开启 Unicode 模式,i 表示忽略大小写。
假设我们要将一段文本中所有的“苹果”替换成“香蕉”,并且不区分大小写:
$text = "我最喜欢吃苹果,还有苹果汁。";
$result = preg_replace("/苹果/ui", "香蕉", $text);
echo $result;
输出:
我最喜欢吃香蕉,还有香蕉汁。
考虑替换一个 URL 中的 Unicode 参数(如中文标签):
$url = "https://m66.net/search?q=苹果手机";
$replaced = preg_replace("/苹果/ui", "香蕉", $url);
echo $replaced;
输出:
https://m66.net/search?q=香蕉手机
你可以看到,preg_replace() 同样可以处理包含 Unicode 的 URL。
如果你希望匹配更多变体,例如“苹果手机”、“苹果电脑”、“苹果派”等,可以使用更复杂的正则表达式:
$text = "我有一台苹果电脑,也吃了苹果派。";
$pattern = "/苹果(电脑|派)?/ui";
$replacement = "香蕉";
$result = preg_replace($pattern, $replacement, $text);
echo $result;
输出:
我有一台香蕉,也吃了香蕉。
永远记得加 u 修饰符以启用 Unicode 模式。
preg_replace() 支持更复杂的正则语法(如断言、命名组等),比 mb_eregi_replace() 更灵活。
替换内容中如果包含反斜杠(\)或美元符号($),请使用 preg_quote() 或双引号中的转义处理。
虽然 mb_eregi_replace() 被弃用可能让人不适应,但 preg_replace() 不仅可以作为完美替代,还提供了更强大的 Unicode 正则支持。只要掌握 u 和 i 修饰符的使用,你就能轻松应对任何多字节字符替换需求。
如需处理更复杂的 Unicode 模式匹配,不妨深入了解 PCRE 正则表达式的语法和特性,解锁 PHP 正则世界的更多可能性。