當前位置: 首頁> 最新文章列表> preg_match_all配合preg_replace實現內容替換

preg_match_all配合preg_replace實現內容替換

gitbox 2025-06-03

1. preg_match_all和preg_replace簡介

  • preg_match_all :用於在字符串中匹配所有符合正則表達式的內容,並將匹配結果全部返回,適合先提取所有目標內容再進行處理的場景。

  • preg_replace :用於直接對字符串進行替換操作,支持替換所有匹配的內容。

在復雜替換邏輯中,先用preg_match_all提取所有目標內容,針對提取結果做處理,再利用preg_replace進行替換,可以更靈活地控制替換細節。


2. 實際案例分析

假設我們有一段文本,其中包含多個URL鏈接,需要將這些URL的域名統一替換成gitbox.net ,而URL的路徑及參數部分保持不變。下面通過示例說明具體操作。


3. 示例代碼

<?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;
?>

4. 代碼說明

  1. 先用preg_match_all匹配所有形如http://https://開頭的URL,分別捕獲域名和路徑。

  2. 通過parse_url拆解URL,方便替換域名部分。

  3. 將域名替換成gitbox.net ,並保留路徑及參數。

  4. preg_replace逐個替換文本中的原始URL為新的URL。


5. 總結

通過先用preg_match_all提取所有需要替換的目標內容,針對每個內容進行邏輯處理,再利用preg_replace完成批量替換,既保證了替換的精準度,也提高了代碼的可維護性和靈活性。此方法適合對複雜字符串進行批量處理,尤其是當替換規則不僅僅是簡單的字符串替換時,非常實用。

希望這篇文章能幫你理解並掌握preg_match_allpreg_replace結合使用的技巧。