= 4.0.5, PHP 5, PHP 7, PHP 8)preg_replace_callback — 執(zhí)行一個(gè)正則表達(dá)式搜索并且使用一個(gè)回調(diào)進(jìn)行替換說(shuō)明preg_replace_callback( string|array $pat">
(PHP 4 >= 4.0.5, PHP 5, PHP 7, PHP 8)
preg_replace_callback — 執(zhí)行一個(gè)正則表達(dá)式搜索并且使用一個(gè)回調(diào)進(jìn)行替換
$pattern
,$callback
,$subject
,$limit
= -1,&$count
= null
,$flags
= 0
這個(gè)函數(shù)的行為除了可以指定一個(gè)
callback
替代
replacement
進(jìn)行替換字符串的計(jì)算,其他方面等同于
preg_replace()。
pattern
要搜索的模式,可以是字符串或一個(gè)字符串?dāng)?shù)組。
callback
一個(gè)回調(diào)函數(shù),在每次需要替換時(shí)調(diào)用,調(diào)用時(shí)函數(shù)得到的參數(shù)是從 subject
中匹配到的結(jié)果?;卣{(diào)函數(shù)返回真正參與替換的字符串。這是該回調(diào)函數(shù)的簽名:
$matches
): string
經(jīng)常會(huì)需要 callback
函數(shù)而僅用于
preg_replace_callback() 一個(gè)地方的調(diào)用。在這種情況下,你可以使用
匿名函數(shù) 來(lái)定義一個(gè)匿名函數(shù)作為
preg_replace_callback()
調(diào)用時(shí)的回調(diào)。 這樣做你可以保留所有調(diào)用信息在同一個(gè)位置并且不會(huì)因?yàn)橐粋€(gè)不在任何其他地方使用的回調(diào)函數(shù)名稱而污染函數(shù)名稱空間。
示例 #1 preg_replace_callback() 和 匿名函數(shù)
<?php
/* 一個(gè)unix樣式的命令行過(guò)濾器,用于將段落開(kāi)始部分的大寫(xiě)字母轉(zhuǎn)換為小寫(xiě)。 */
$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
要搜索替換的目標(biāo)字符串或字符串?dāng)?shù)組。
limit
對(duì)于每個(gè)模式用于每個(gè) subject
字符串的最大可替換次數(shù)。
默認(rèn)是 -1
(無(wú)限制)。
count
如果指定,這個(gè)變量將被填充為替換執(zhí)行的次數(shù)。
flags
flags
可以是 PREG_OFFSET_CAPTURE
和 PREG_UNMATCHED_AS_NULL
標(biāo)志的組合, 這會(huì)影響匹配到的結(jié)果的格式。
相關(guān)詳情請(qǐng)參閱 preg_match() 中的描述。
如果 subject
是一個(gè)數(shù)組,
preg_replace_callback() 返回一個(gè)數(shù)組,其他情況返回字符串。錯(cuò)誤發(fā)生時(shí)返回 null
。
如果查找到了匹配,返回替換后的目標(biāo)字符串(或字符串?dāng)?shù)組),其他情況
subject
將會(huì)無(wú)變化返回。
版本 | 說(shuō)明 |
---|---|
7.4.0 |
新增 flags 參數(shù)。
|
示例 #2 preg_replace_callback()示例
<?php
// 將文本中的年份增加一年.
$text = "April fools day is 04/01/2002\n";
$text.= "Last christmas was 12/24/2001\n";
// 回調(diào)函數(shù)
function next_year($matches)
{
// 通常: $matches[0]是完成的匹配
// $matches[1]是第一個(gè)捕獲子組的匹配
// 以此類推
return $matches[1].($matches[2]+1);
}
echo preg_replace_callback(
"|(\d{2}/\d{2}/)(\d{4})|",
"next_year",
$text);
?>
以上例程會(huì)輸出:
April fools day is 04/01/2003 Last christmas was 12/24/2002
示例 #3 preg_replace_callback() 使用遞歸構(gòu)造處理 BB 碼的封裝
<?php
$input = "plain [indent] deep [indent] deeper [/indent] deep [/indent] plain";
function parseTagsRecursive($input)
{
/* 譯注: 對(duì)此正則表達(dá)式分段分析
* 首尾兩個(gè)#是正則分隔符
* \[indent] 匹配一個(gè)原文的[indent]
* ((?:[^[]|\[(?!/?indent])|(?R))+)分析:
* (?:[^[]|\[(?!/?indent])分析:
* 首先它是一個(gè)非捕獲子組
* 兩個(gè)可選路徑, 一個(gè)是非[字符, 另一個(gè)是[字符但后面緊跟著不是/indent或indent.
* (?R) 正則表達(dá)式遞歸
* \[/indent] 匹配結(jié)束的[/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;
?>