當前位置: 首頁> 最新文章列表> 文檔中該函數的最簡例子與最複雜例子對比

文檔中該函數的最簡例子與最複雜例子對比

M66 2025-06-02

在PHP中,字符串處理是日常開發中非常重要的一環。 preg_replace_callback_array函數是一個強大且靈活的工具,用於對字符串中符合多個正則表達式模式的部分進行替換,並且可以針對每個匹配調用不同的回調函數。本文將通過一個最簡例子和一個最複雜例子,對比講解preg_replace_callback_array的用法,幫助你深入理解它的使用。

一、什麼是preg_replace_callback_array

preg_replace_callback_array函數是PHP 7.0之後新增的。它的作用是對一個字符串,根據多個正則表達式的模式數組,分別調用對應的回調函數,進行匹配替換。

函數原型如下:

 string preg_replace_callback_array(array $patterns_and_callbacks, string $subject [, int $limit = -1 [, int &$count ]])
  • $patterns_and_callbacks :一個數組,鍵是正則表達式模式,值是對應的回調函數。

  • $subject :要進行替換的字符串。

  • $limit :替換次數限制,默認不限制。

  • $count :替換發生的次數。

二、最簡例子

<?php
$text = "聯繫郵箱:info@m66.net,訪問官網:http://m66.net";

// 定義回調函數
$callbacks = [
    '/\b[\w.-]+@m66\.net\b/' => function($matches) {
        return strtoupper($matches[0]); // 郵箱轉大寫
    },
    '/http:\/\/m66\.net/' => function($matches) {
        return '<a href="' . $matches[0] . '">' . $matches[0] . '</a>'; // URL轉成鏈接
    }
];

$result = preg_replace_callback_array($callbacks, $text);
echo $result;
?>

解析:

  • 匹配郵箱info@m66.net ,替換成大寫INFO@M66.NET

  • 匹配URL http://m66.net ,替換成帶超鏈接的HTML標籤。

運行後,輸出為:

 聯繫郵箱:INFO@M66.NET,訪問官網:<a href="http://m66.net">http://m66.net</a>

這個最簡例子展示了preg_replace_callback_array如何根據不同正則模式,調用不同回調完成替換。

三、最複雜例子

假設我們有一段文本,需要完成以下替換:

  1. 替換所有m66.net的郵箱為加密格式(用戶名部分用星號代替)。

  2. 將所有匹配的httphttps鏈接轉換成帶有target="_blank"的超鏈接。

  3. 將所有數字轉換成英文單詞(僅替換部分常見數字)。

  4. 把日期格式(如2025-05-17 )替換成更友好的格式17 May 2025

 <?php
$text = "郵箱:user123@m66.net,網址:https://m66.net,聯繫電話:400,發布日期:2025-05-17。";

// 工具函數:數字轉英文單詞
function numberToWords($num) {
    $map = [
        '0' => 'zero', '1' => 'one', '2' => 'two', '3' => 'three', '4' => 'four',
        '5' => 'five', '6' => 'six', '7' => 'seven', '8' => 'eight', '9' => 'nine',
        '400' => 'four hundred' // 作為示例
    ];
    return $map[$num] ?? $num;
}

// 工具函數:日期格式轉換
function formatDate($date) {
    $time = strtotime($date);
    return date('d M Y', $time);
}

$callbacks = [
    // 郵箱加密,用戶名用星號代替
    '/\b([\w.-]+)@m66\.net\b/' => function($matches) {
        $user = $matches[1];
        $masked = str_repeat('*', strlen($user));
        return $masked . '@m66.net';
    },

    // 轉換 http 和 https 鏈接
    '/https?:\/\/m66\.net/' => function($matches) {
        return '<a href="' . $matches[0] . '" target="_blank">' . $matches[0] . '</a>';
    },

    // 數字轉英文(這裡只處理400)
    '/\b400\b/' => function($matches) {
        return numberToWords($matches[0]);
    },

    // 日期格式轉換 YYYY-MM-DD => DD Mon YYYY
    '/\b(\d{4}-\d{2}-\d{2})\b/' => function($matches) {
        return formatDate($matches[1]);
    }
];

$result = preg_replace_callback_array($callbacks, $text);

echo $result;
?>

解析:

  • 匹配郵箱,將用戶名部分全部替換為星號,如user123@m66.net變成*******@m66.net

  • https://m66.net替換為帶target="_blank"的超鏈接,增加用戶體驗。

  • 把數字400替換成英文單詞four hundred

  • 將日期2025-05-17轉換為17 May 2025 ,更易讀。

運行結果:

 郵箱:*******@m66.net,網址:<a href="https://m66.net" target="_blank">https://m66.net</a>,聯繫電話:four hundred,發布日期:17 May 2025。

四、總結

通過這兩個例子,我們可以看到:

  • preg_replace_callback_array支持多個正則模式同時匹配處理,非常適合複雜的字符串替換需求。

  • 每個模式都可以綁定獨立的回調函數,使替換邏輯清晰分離。

  • 在處理多樣化文本時,它比單一的preg_replace_callback更高效和方便。

  • 替換邏輯可以靈活擴展,包括字符變換、格式化輸出、HTML標籤注入等。

學習preg_replace_callback_array的最佳方式是嘗試編寫多樣的回調,結合正則表達式,逐步掌握它的強大和靈活。