男女疯狂一边摸一边做羞羞视频|啊好深好硬快点用力别停动态图|亚洲一区无码中文字幕|特级无码毛片免费视频播放▽|久久狠狠躁免费观看|国内精品久久久久久网站

preg_replace_callback

(PHP 4 >= 4.0.5, PHP 5, PHP 7, PHP 8)

preg_replace_callback執行一個(gè)正則表達式搜索并且使用一個(gè)回調進(jìn)行替換

說(shuō)明

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

這個(gè)函數的行為除了可以指定一個(gè) callback 替代 replacement 進(jìn)行替換字符串的計算,其他方面等同于 preg_replace()。

參數

pattern

要搜索的模式,可以是字符串或一個(gè)字符串數組。

callback

一個(gè)回調函數,在每次需要替換時(shí)調用,調用時(shí)函數得到的參數是從 subject 中匹配到的結果?;卣{函數返回真正參與替換的字符串。這是該回調函數的簽名:

handler(array $matches): string

經(jīng)常會(huì )需要 callback 函數而僅用于 preg_replace_callback() 一個(gè)地方的調用。在這種情況下,你可以使用 匿名函數 來(lái)定義一個(gè)匿名函數作為 preg_replace_callback() 調用時(shí)的回調。 這樣做你可以保留所有調用信息在同一個(gè)位置并且不會(huì )因為一個(gè)不在任何其他地方使用的回調函數名稱(chēng)而污染函數名稱(chēng)空間。

示例 #1 preg_replace_callback() 和 匿名函數

<?php
/* 一個(gè)unix樣式的命令行過(guò)濾器,用于將段落開(kāi)始部分的大寫(xiě)字母轉換為小寫(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

要搜索替換的目標字符串或字符串數組。

limit

對于每個(gè)模式用于每個(gè) subject 字符串的最大可替換次數。 默認是 -1(無(wú)限制)。

count

如果指定,這個(gè)變量將被填充為替換執行的次數。

flags

flags 可以是 PREG_OFFSET_CAPTUREPREG_UNMATCHED_AS_NULL 標志的組合, 這會(huì )影響匹配到的結果的格式。 相關(guān)詳情請參閱 preg_match() 中的描述。

返回值

如果 subject 是一個(gè)數組, preg_replace_callback() 返回一個(gè)數組,其他情況返回字符串。錯誤發(fā)生時(shí)返回 null。

如果查找到了匹配,返回替換后的目標字符串(或字符串數組),其他情況 subject 將會(huì )無(wú)變化返回。

更新日志

版本 說(shuō)明
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]是第一個(gè)捕獲子組的匹配
  // 以此類(lèi)推
  
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() 使用遞歸構造處理 BB 碼的封裝

<?php
$input 
"plain [indent] deep [indent] deeper [/indent] deep [/indent] plain";

function 
parseTagsRecursive($input)
{
     
/* 譯注: 對此正則表達式分段分析
     * 首尾兩個(gè)#是正則分隔符
     * \[indent] 匹配一個(gè)原文的[indent]
     * ((?:[^[]|\[(?!/?indent])|(?R))+)分析:
     *   (?:[^[]|\[(?!/?indent])分析:
     *  首先它是一個(gè)非捕獲子組
     *   兩個(gè)可選路徑, 一個(gè)是非[字符, 另一個(gè)是[字符但后面緊跟著(zhù)不是/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;
?>

參見(jiàn)

男女疯狂一边摸一边做羞羞视频|啊好深好硬快点用力别停动态图|亚洲一区无码中文字幕|特级无码毛片免费视频播放▽|久久狠狠躁免费观看|国内精品久久久久久网站