首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP preg_replace_callback 進階用法:正則替換回調函數詳解

     編輯:PHP 相關知識

PHP preg_replace_callback 進階用法:正則替換回調函數詳解

preg_replace_callback() 是 PHP 正則替換的利器:將匹配內容傳遞給回調函數處理,返回替換結果。適用於複雜替換邏輯(如條件判斷、動態計算、多階段轉換)。

語法原型

preg_replace_callback(
    string|array $pattern,
    callable $callback,
    string|array $subject,
    int $limit = -1,
    int &$count = null
): string|array

實戰範例:結構化文本鍵值對轉 HTML

<?php
$Text = "Title: Hello world!\n";
$Text .= "Author: Jonas\n";
$Text .= "This is a example message!\n\n";
$Text .= "Title: Entry 2\n";
$Text .= "Author: Sonja\n";
$Text .= "Hello world, what's up!\n";

// 回調函數:將 "Key: Value" 轉為 "Key: Value"
function RewriteText($matches) {
    $key = $matches[1];   // ([a-z0-9]+)
    $value = $matches[2]; // ([^\n\r]+)
    return '<b>' . $key . '</b>: ' . $value;
}

// 正則:匹配換行開頭的 "Key: Value"
$pattern = '/[\r\n]([a-z0-9]+): ([^\n\r]+)/i';
$NewText = preg_replace_callback($pattern, "RewriteText", $Text);

echo $NewText;
/* 輸出:
<b>Title</b>: Hello world!
<b>Author</b>: Jonas
...
*/

核心參數解析

  • $matches[0]:完整匹配的字符串(含換行符)。
  • $matches[1], $matches[2]...:捕獲組內容。
  • 回調函數必須返回字符串作為替換結果。
  • 可使用匿名函數(Closure)捕獲外部變量:fn($m) => ...。

進階技巧

  1. 條件替換:回調中根據業務邏輯決定是否替換(返回原字符串 $matches[0] 表示不替換)。
  2. 計數器:利用 &$count 統計實際替換次數。
  3. 限制次數:$limit 參數控制最大替換次數。
  4. 性能優化:對於固定替換,preg_replace 更快;僅在邏輯複雜時用 callback。

常見陷阱

  • 正則未加 /i 忽略大小寫導致匹配失敗。
  • 貪婪匹配導致跨行捕獲,建議使用 [^\n\r]+ 而非 .*。
  • 回調函數拋出異常會中斷整個替換流程,需內部捕獲處理。

掌握 preg_replace_callback,讓正則替換從「死板」變「靈活」。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved