preg_replace_callback
(PHP 4 >= 4.0.5, PHP 5, PHP 7, PHP 8)
preg_replace_callback — 執行一個正規表示式搜索並且使用一個回撥進行替換
說明
string|array
$pattern,callable
$callback,string|array
$subject,int
$limit = -1,int
&$count = null,int
$flags = 0): string|array|null
  這個函式的行為除了可以指定一個
  callback 替代
  replacement
  進行替換字串的計算,其他方面等同於
  preg_replace()。
  
參數
- 
pattern
- 
      要搜索的模式,可以是字串或一個字串陣列。 
- 
callback
- 
      一個回撥函式,在每次需要替換時呼叫,呼叫時函式得到的參數是從 subject中匹配到的結果。回撥函式返回真正參與替換的字串。這是該回調函式的簽名:handler(array$matches): string經常會需要 callback函式而僅用於 preg_replace_callback() 一個地方的呼叫。在這種情況下,你可以使用 匿名函式 來定義一個匿名函式作為 preg_replace_callback() 呼叫時的回撥。 這樣做你可以保留所有呼叫資訊在同一個位置並且不會因為一個不在任何其他地方使用的回撥函式名稱而污染函式名稱空間。示例 #1 preg_replace_callback() 和 匿名函式 <?php
 /* 一個unix樣式的命令列過濾器,用於將段落開始部分的大寫字母轉換為小寫。 */
 $fp = fopen("php://stdin", "r") or die("can't read stdin");
 while (!feof($fp)) {
 $line = fgets($fp);
 $line = preg_replace_callback(
 '|<p>\s*\w|',
 function ($matches) {
 return strtolower($matches[0]);
 },
 $line
 );
 echo $line;
 }
 fclose($fp);
 ?>
- 
subject
- 
      要搜索替換的目標字串或字串陣列。 
- 
limit
- 
      對於每個模式用於每個 subject字串的最大可替換次數。 預設是-1(無限制)。
- 
count
- 
      如果指定,這個變數將被填充為替換執行的次數。 
- 
flags
- 
      flags可以是PREG_OFFSET_CAPTURE和PREG_UNMATCHED_AS_NULL標誌的組合, 這會影響匹配到的結果的格式。 相關詳情請參閱 preg_match() 中的描述。
返回值
    如果 subject 是一個陣列,
    preg_replace_callback() 返回一個陣列,其他情況返回字串。錯誤發生時返回 null。
  
  如果查詢到了匹配,返回替換后的目標字串(或字串陣列),其他情況
  subject 將會無變化返回。
  
更新日誌
| 版本 | 說明 | 
|---|---|
| 7.4.0 | 新增 flags參數。 | 
範例
示例 #2 preg_replace_callback()示例
<?php
// 將文字中的年份增加一年.
$text = "April fools day is 04/01/2002\n";
$text.= "Last christmas was 12/24/2001\n";
// 回撥函式
function next_year($matches)
{
  // 通常: $matches[0]是完成的匹配
  // $matches[1]是第一個捕獲子組的匹配
  // 以此類推
  return $matches[1].($matches[2]+1);
}
echo preg_replace_callback(
            "|(\d{2}/\d{2}/)(\d{4})|",
            "next_year",
            $text);
?>
以上例程會輸出:
April fools day is 04/01/2003 Last christmas was 12/24/2002
示例 #3 preg_replace_callback() 使用遞迴構造處理 BB 碼的封裝
<?php
$input = "plain [indent] deep [indent] deeper [/indent] deep [/indent] plain";
function parseTagsRecursive($input)
{
     /* 譯註: 對此正規表示式分段分析
     * 首尾兩個#是正則分隔符
     * \[indent] 匹配一個原文的[indent]
     * ((?:[^[]|\[(?!/?indent])|(?R))+)分析:
     *   (?:[^[]|\[(?!/?indent])分析:
     *  首先它是一個非捕獲子組
     *   兩個可選路徑, 一個是非[字元, 另一個是[字元但後面緊跟著不是/indent或indent.
     *   (?R) 正規表示式遞迴
     *     \[/indent] 匹配結束的[/indent]
     * /
    $regex = '#\[indent]((?:[^[]|\[(?!/?indent])|(?R))+)\[/indent]#';
    if (is_array($input)) {
        $input = '<div style="margin-left: 10px">'.$input[1].'</div>';
    }
    return preg_replace_callback($regex, 'parseTagsRecursive', $input);
}
$output = parseTagsRecursive($input);
echo $output;
?>
參見
- PCRE 模式
- preg_replace_callback_array() - Perform a regular expression search and replace using callbacks
- preg_quote() - 轉義正規表示式字元
- preg_replace() - 執行一個正規表示式的搜索和替換
- preg_last_error() - 返回最後一個PCRE正則執行產生的錯誤程式碼
- 匿名函式