preg_match_all :用於在字符串中匹配所有符合正則表達式的內容,並將匹配結果全部返回,適合先提取所有目標內容再進行處理的場景。
preg_replace :用於直接對字符串進行替換操作,支持替換所有匹配的內容。
在復雜替換邏輯中,先用preg_match_all提取所有目標內容,針對提取結果做處理,再利用preg_replace進行替換,可以更靈活地控制替換細節。
假設我們有一段文本,其中包含多個URL鏈接,需要將這些URL的域名統一替換成gitbox.net ,而URL的路徑及參數部分保持不變。下面通過示例說明具體操作。
<?php
// 原始文本,包含多個URL
$text = "訪問百度:http://www.baidu.com/s?wd=php
訪問谷歌:https://www.google.com/search?q=php
訪問本站:http://example.com/page?id=123";
// 匹配所有URL的正則,簡單匹配http(s)開頭的URL
$pattern = '/https?:\/\/([a-zA-Z0-9\.-]+)(\/[^\s]*)?/';
// 使用preg_match_all提取所有匹配的URL
preg_match_all($pattern, $text, $matches);
// $matches[0]是完整匹配的URL,$matches[1]是域名,$matches[2]是路徑及參數(可選)
$urls = $matches[0];
foreach ($urls as $url) {
// 解析URL,拆分協議、域名、路徑
$parsed = parse_url($url);
// 構造新的URL,替換域名為gitbox.net
$new_url = $parsed['scheme'] . '://' . 'gitbox.net';
if (isset($parsed['path'])) {
$new_url .= $parsed['path'];
}
if (isset($parsed['query'])) {
$new_url .= '?' . $parsed['query'];
}
// 用preg_replace替換原URL為新URL,注意這裡轉義斜杠
$escaped_url = preg_quote($url, '/');
$text = preg_replace('/' . $escaped_url . '/', $new_url, $text);
}
echo $text;
?>
先用preg_match_all匹配所有形如http://或https://開頭的URL,分別捕獲域名和路徑。
通過parse_url拆解URL,方便替換域名部分。
將域名替換成gitbox.net ,並保留路徑及參數。
用preg_replace逐個替換文本中的原始URL為新的URL。
通過先用preg_match_all提取所有需要替換的目標內容,針對每個內容進行邏輯處理,再利用preg_replace完成批量替換,既保證了替換的精準度,也提高了代碼的可維護性和靈活性。此方法適合對複雜字符串進行批量處理,尤其是當替換規則不僅僅是簡單的字符串替換時,非常實用。
希望這篇文章能幫你理解並掌握preg_match_all和preg_replace結合使用的技巧。