在處理字符串替換時,PHP 的preg_replace_callback()函數可以通過一個回調函數對匹配結果進行靈活處理。但如果你有多個不同的正則表達式,每個需要用不同的邏輯來處理, preg_replace_callback_array()就是你理想的選擇。
自PHP 7 起, preg_replace_callback_array()提供了一種優雅的方式,允許我們用一個關聯數組的形式,同時定義多個正則模式及其對應的回調函數。
本文將帶你了解其用法,並通過示例展示如何同時處理多個匹配邏輯。
preg_replace_callback_array(array $patterns_and_callbacks, string $subject, int $limit = -1, int &$count = null): string|array|null
$patterns_and_callbacks是一個關聯數組,鍵是正則表達式,值是對應的回調函數。
$subject是要處理的字符串。
假設我們要識別文本中的鏈接和郵箱地址,將鏈接包裹成<a>標籤,同時將郵箱地址加上mailto: 。
$text = <<<EOT
歡迎訪問我們的網站 http://m66.net/page,你也可以發郵件到 support@m66.net 諮詢。
EOT;
$result = preg_replace_callback_array([
// 處理 URL
'/\bhttps?:\/\/[^\s]+/i' => function ($matches) {
$url = htmlspecialchars($matches[0]);
return "<a href=\"{$url}\">{$url}</a>";
},
// 處理邮箱地址
'/[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}/i' => function ($matches) {
$email = htmlspecialchars($matches[0]);
return "<a href=\"mailto:{$email}\">{$email}</a>";
}
], $text);
echo $result;
歡迎訪問我們的網站 <a href="http://m66.net/page">http://m66.net/page</a>,你也可以發郵件到 <a href="mailto:support@m66.net">support@m66.net</a> 諮詢。
preg_replace_callback_array()特別適合處理:
各類文本解析,如Markdown、BBCode、自定義語法等;
多種格式的識別與替換;
分離處理複雜文本中的不同結構時提高可讀性和維護性。
正則表達式的順序很重要,前面的規則會優先執行。
使用htmlspecialchars()來避免XSS 攻擊(尤其是在處理用戶輸入時)。
PHP 的PCRE 庫在高版本中更加強大,建議使用PHP 7.1+。
使用preg_replace_callback_array() ,我們可以輕鬆定義多個正則模式及其對應處理方式,代碼結構更清晰、邏輯更分離。它是文本處理中一個強大且被低估的工具。
掌握它,不僅能讓你的代碼更優雅,也能顯著提高開發效率。