正則量詞 *、+、?、{n,m} 預設為貪婪模式:盡可能匹配最長字串。
<?php
$str = "https://www.baidu/.com?url=www.sina.com/";
preg_match("/http:(.*)com/", $str, $matches);
print_r($matches);
/* 結果:
Array (
[0] => https://www.baidu/.com?url=www.sina.com
[1] => //www.baidu/.com?url=www.sina.
)
*/
.* 貪婪吞噬至最後一個 com,導致匹配過長。
在量詞後添加 ? 即切換為非貪婪(懶惰)模式:匹配最短滿足條件的字串。
<?php
$str = "https://www.baidu/.com?url=www.sina.com/";
preg_match("/http:(.*?)com/", $str, $matches); // 注意 .*?
print_r($matches);
/* 結果:
Array (
[0] => https://www.baidu/.com
[1] => //www.baidu/.
)
*/
| 貪婪 | 非貪婪 | 說明 |
|---|---|---|
* | *? | 零次或多次 |
+ | +? | 一次或多次 |
? | ?? | 零次或一次 |
{n,m} | {n,m}? | n 到 m 次 |
[^"]* 替代 .*? 提升效能preg_match_all() 觀察所有匹配結果,理解量詞行為掌握貪婪與非貪婪的切換,是編寫精準高效正則表達式的核心技能。