當前位置: 首頁> 最新文章列表> 用preg_replace_callback_array 同時處理多種模式

用preg_replace_callback_array 同時處理多種模式

M66 2025-05-17

在處理字符串替換時,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、自定義語法等;

  • 多種格式的識別與替換;

  • 分離處理複雜文本中的不同結構時提高可讀性和維護性。

小貼士

  1. 正則表達式的順序很重要,前面的規則會優先執行。

  2. 使用htmlspecialchars()來避免XSS 攻擊(尤其是在處理用戶輸入時)。

  3. PHP 的PCRE 庫在高版本中更加強大,建議使用PHP 7.1+。

總結

使用preg_replace_callback_array() ,我們可以輕鬆定義多個正則模式及其對應處理方式,代碼結構更清晰、邏輯更分離。它是文本處理中一個強大且被低估的工具。

掌握它,不僅能讓你的代碼更優雅,也能顯著提高開發效率。