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_match | 1 (匹配到)、0 (無匹配)、false (錯誤) |
preg_match_all | 匹配次數 (整數)、false (錯誤) |
preg_match_all 可能佔用大量記憶體 (建立巨大陣列),考慮 preg_match 迴圈 + offset 逐段處理。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。