首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

preg_match 與 preg_match_all 差異詳解:單次匹配 vs 全域匹配

     編輯:PHP 相關知識

核心差異一句話

preg_match **找到第一個匹配即停止**;preg_match_all **掃描整個字串,回傳所有匹配**。

函式簽名對比

// 找到第一個匹配,$matches[0] 為完整匹配,$matches[1]... 為捕獲組
preg_match(string $pattern, string $subject, array &$matches = null, int $flags = 0, int $offset = 0): int|false

// 找到所有不重疊匹配,預設 PREG_PATTERN_ORDER
preg_match_all(string $pattern, string $subject, array &$matches = null, int $flags = 0, int $offset = 0): int|false

實例演示

$str = 'abc';

// 1. preg_match_all:找出所有單字字元
preg_match_all('/(\w)+/', $str, $m);
print_r($m);
/*
Array
(
    [0] => Array ( [0] => a [1] => b [2] => c )  // 完整匹配
    [1] => Array ( [0] => a [1] => b [2] => c )  // 第一個捕獲組
)
*/

// 2. preg_match:只取第一個
preg_match('/(\w)+/', $str, $m);
print_r($m);
/*
Array
(
    [0] => a
    [1] => a
)
*/

回傳值意義

函式回傳值
preg_match1 (匹配到)、0 (無匹配)、false (錯誤)
preg_match_all匹配次數 (整數)、false (錯誤)

常見使用場景

需求選擇範例
驗證格式 (Email、手機、身分證)preg_matchif (preg_match('/^[\w.+-]+@\w+\.\w+$/', $email))
提取所有連結/圖片/標籤preg_match_allpreg_match_all('/
字串替換所有出現preg_replacepreg_replace('/\s+/', ' ', $str)
只替換第一處preg_replace(..., 1)第 4 參數 limit = 1
分割字串preg_splitpreg_split('/\s*,\s*/', $csv)

效能提示

  • 大字串 (MB 級) 用 preg_match_all 可能佔用大量記憶體 (建立巨大陣列),考慮 preg_match 迴圈 + offset 逐段處理。
  • 複雜正則易觸發 **回溯災難** (Catastrophic Backtracking),善用 **佔有優先量詞** (`*+`, `++`, `?+`, `{n,m}+`)、**原子分組** (`(?>...)`) 或改用解析器。
  • 單純字串搜尋/替換優先用 `strpos`/`str_replace`,速度快數倍且無正則開銷。

進階旗標 PREG_OFFSET_CAPTURE / PREG_SET_ORDER

// 取得每個匹配在字串中的位移
preg_match_all('/\d+/', 'a12b34', $m, PREG_OFFSET_CAPTURE);
/*
[0] => Array ( [0] => Array ( [0] => 12 [1] => 1 ) [1] => Array ( [0] => 34 [1] => 4 ) )
*/

// 依匹配順序分組 (每組包含完整匹配+捕獲組)
preg_match_all('/(\d)(\d)/', '1234', $m, PREG_SET_ORDER);
/*
[0] => Array ( [0] => 12 [1] => 1 [2] => 2 )
[1] => Array ( [0] => 34 [1] => 3 [2] => 4 )
*/

總結

  • **驗證、取第一筆** → preg_match。
  • **提取所有、統計次數、批次處理** → preg_match_all。
  • **替換** → preg_replace (配合 limit 參數控制次數)。
  • **分割** → preg_split。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved