在使用preg_replace_callback_array處理複雜文本替換時,常常需要在正則回調函數中調試匹配項、判斷邏輯是否正確。 PHP 提供了兩個非常實用的調試函數: var_dump()和print_r() 。本文將通過實例演示,如何在preg_replace_callback_array中藉助這兩個函數更方便地調試正則回調邏輯。
preg_replace_callback_array()是PHP 7.0 及以上版本提供的函數,允許你傳入一個正則表達式與回調函數組成的關聯數組,它會遍歷匹配文本並根據對應的回調函數進行替換。
preg_replace_callback_array(array $patterns_and_callbacks, string $subject, int $limit = -1, int &$count = null): string
相比preg_replace_callback ,它能處理多個正則表達式和多個回調函數,邏輯更清晰、擴展性更強。
假設我們有一段文本,裡面混合了Markdown 風格的鏈接和自定義的{{code}}標籤,我們想用preg_replace_callback_array統一處理它們:
$text = '點擊 [這裡](https://m66.net) 查看詳情,或者使用 {{print_name}} 變量。';
我們定義兩個模式,並為它們指定各自的回調函數:
$patterns = [
// 匹配 markdown 鏈接:[文字](URL)
'/\[(.*?)\]\((.*?)\)/' => function ($matches) {
echo "匹配到 markdown 鏈接:\n";
print_r($matches);
return '<a href="' . htmlspecialchars($matches[2]) . '">' . htmlspecialchars($matches[1]) . '</a>';
},
// 匹配 {{變量}} 形式
'/\{\{(.*?)\}\}/' => function ($matches) {
echo "匹配到變量标签:\n";
var_dump($matches);
$variableName = $matches[1];
// 模拟變量替换
$variables = [
'print_name' => '使用者名稱'
];
return isset($variables[$variableName]) ? $variables[$variableName] : '';
}
];
$result = preg_replace_callback_array($patterns, $text);
echo "\n最終替換結果:\n" . $result;
匹配到 markdown 鏈接:
Array
(
[0] => [這裡](https://m66.net)
[1] => 這裡
[2] => https://m66.net
)
匹配到變量标签:
array(2) {
[0]=>
string(17) "{{print_name}}"
[1]=>
string(10) "print_name"
}
最終替換結果:
點擊 <a href="https://m66.net">這裡</a> 查看詳情,或者使用 使用者名稱 變量。
使用print_r()輸出結構清晰的數組,更適合人類閱讀;
使用var_dump()查看數據類型和長度,在處理多種數據結構時尤其有用;
為了避免調試信息污染網頁輸出,建議在CLI 或日誌文件中進行調試;
在上線前移除或註釋所有調試語句,確保輸出整潔。
preg_replace_callback_array提供了強大的多模式正則替換能力,在調試階段配合var_dump()與print_r()能幫助我們快速了解匹配情況、驗證邏輯是否正確。掌握這套調試方法,能大大提高你處理複雜文本處理任務的效率。