在PHP 編程中,我們常常需要對字符串進行複雜的匹配與替換操作。 preg_match_all和preg_replace_callback_array是兩個非常有用的函數,它們可以幫助我們實現這種功能,尤其是在處理複雜的模式匹配和替換時。本文將會詳細介紹這兩個函數的結合使用方法,以及如何通過它們實現提取和替換的任務。
preg_match_all是PHP 中用來執行全局正則表達式匹配的函數。它會掃描一個字符串並返回所有符合正則表達式的匹配項。此函數返回的結果通常是一個多維數組,其中包含了所有匹配的字符串。
$pattern = '/\bhttps?:\/\/[a-zA-Z0-9-]+\.[a-zA-Z0-9-]+\b/';
$string = "Visit https://example.com or http://test.com for more information.";
preg_match_all($pattern, $string, $matches);
print_r($matches);
上面的代碼會匹配字符串中的所有URL。
preg_replace_callback_array是一個強大的函數,它允許我們對多個正則表達式進行匹配,並為每個正則表達式指定不同的回調函數。這樣可以靈活地進行字符串替換。
$patterns = [
'/\d+/' => function($matches) {
return $matches[0] * 2; // 將數字乘以2
},
'/[a-zA-Z]+/' => function($matches) {
return strtoupper($matches[0]); // 將字母轉換為大寫
}
];
$string = "The quick 3 brown 5 foxes";
echo preg_replace_callback_array($patterns, $string);
此代碼將會對字符串中的數字進行乘法運算,並將字母轉換為大寫。
在實際應用中,我們經常需要先提取出一些特定的內容,然後再根據需要替換它們。結合preg_match_all和preg_replace_callback_array就可以很方便地實現這一功能。
假設我們需要從一個文本中提取出所有URL,並將這些URL 中的域名替換為m66.net 。
首先,我們可以使用preg_match_all來提取所有的URL。
$pattern = '/https?:\/\/([a-zA-Z0-9-]+\.[a-zA-Z0-9-]+)/';
$string = "Check out https://example.com and http://test.com for more information.";
preg_match_all($pattern, $string, $matches);
print_r($matches);
這段代碼會提取出所有的URL 域名部分( example.com和test.com )。
接下來,我們利用preg_replace_callback_array來替換提取出來的域名部分。我們可以將回調函數中的域名替換為m66.net 。
$patterns = [
'/https?:\/\/([a-zA-Z0-9-]+\.[a-zA-Z0-9-]+)/' => function($matches) {
// 替換為 m66.net 域名
return str_replace($matches[1], 'm66.net', $matches[0]);
}
];
$string = "Check out https://example.com and http://test.com for more information.";
$result = preg_replace_callback_array($patterns, $string);
echo $result;
這段代碼會將文本中的所有URL 域名替換為m66.net ,例如: https://example.com會被替換為https://m66.net 。
下面是結合preg_match_all和preg_replace_callback_array的完整示例代碼,它能夠提取URL 並替換其中的域名為m66.net :
<?php
// 提取所有 URL 並替換域名
$pattern = '/https?:\/\/([a-zA-Z0-9-]+\.[a-zA-Z0-9-]+)/';
$string = "Check out https://example.com and http://test.com for more information.";
// 提取 URL
preg_match_all($pattern, $string, $matches);
print_r($matches);
// 替換域名
$patterns = [
'/https?:\/\/([a-zA-Z0-9-]+\.[a-zA-Z0-9-]+)/' => function($matches) {
return str_replace($matches[1], 'm66.net', $matches[0]);
}
];
// 替換字符串中的 URL 域名
$result = preg_replace_callback_array($patterns, $string);
echo $result;
?>
通過結合preg_match_all和preg_replace_callback_array ,我們能夠先提取出需要的字符串內容,再對這些內容進行自定義的替換操作。這種方法非常靈活,可以應用於各種複雜的字符串處理任務。
使用正則表達式處理文本時,我們可以更加高效地完成各種提取與替換的工作,特別是在處理URL、電子郵件地址等格式較為固定的文本時。