當前位置: 首頁> 最新文章列表> 在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的現狀,避免盲目擔心和使用過時函數,保持代碼的現代性和穩定性。