在PHP中,字符串處理是日常開發中非常重要的一環。 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如何根據不同正則模式,調用不同回調完成替換。
假設我們有一段文本,需要完成以下替換:
替換所有m66.net的郵箱為加密格式(用戶名部分用星號代替)。
將所有匹配的http或https鏈接轉換成帶有target="_blank"的超鏈接。
將所有數字轉換成英文單詞(僅替換部分常見數字)。
把日期格式(如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的最佳方式是嘗試編寫多樣的回調,結合正則表達式,逐步掌握它的強大和靈活。