PHP preg 正則函數詳細筆記
1. preg_match 與 preg_match_all 差異
preg_match:只匹配第一次,隨即停止。
preg_match_all:匹配所有符合項,直到字串結束。
<?php
// 非貪婪模式 /a.+?e/
preg_match("/a.+?e/", "abcdefgabcdefgabcdefg", $out1);
preg_match_all("/a.+?e/", "abcdefgabcdefgabcdefg", $out2);
var_dump($out1); // 單一結果
var_dump($out2); // 三個結果
?>
2. 貪婪 vs 非貪婪模式
- 貪婪(預設):盡可能匹配最長字串。量詞
*、+、?、{n,}。
- 非貪婪:量詞後加
?(如 *?、+?),匹配最短字串。
<?php
$str = "https://www.baidu/.com?url=www.sina.com/";
preg_match("/http:(.*)com/", $str, $m1); // 貪婪:匹配到最後一個 com
preg_match("/http:(.*?)com/", $str, $m2); // 非貪婪:匹配到第一個 com
var_dump($m1, $m2);
?>
3. preg_match_all 旗標:PREG_PATTERN_ORDER vs PREG_SET_ORDER
- PREG_PATTERN_ORDER(預設):結果為
$matches[0] 為完整匹配陣列,$matches[1] 為第一個捕獲組陣列...。
- PREG_SET_ORDER:結果為
$matches[0] 為第一次匹配的所有捕獲組,$matches[1] 為第二次匹配...。
<?php
$html = "start: this is a testend";
preg_match_all("|<[^>]+>(.*)[^>]+>|U", $html, $out1); // PREG_PATTERN_ORDER
preg_match_all("|<[^>]+>(.*)[^>]+>|U", $html, $out2, PREG_SET_ORDER);
var_dump($out1, $out2);
?>
延伸閱讀
preg_replace 進階替換技巧
- PCRE 正則語法完整參考
- PHP 正則效能優化建議