2010-04-07 129 views
8

假設我們有這個html內容,並且我們願意用正則表達式獲得Content1,Content2,.. ..(。*)代替(。*?)

<li>Content1</li> 
<li>Content2</li> 
<li>Content3</li> 
<li>Content4</li> 

如果我使用下面

preg_match_all('/<li>(.*)<\/li>/', $text, $result); 

線我將得到的陣列與含有單排:

Content1</li> 
<li>Content2</li> 
<li>Content3</li> 
<li>Content4 

並且通過使用該代碼:

preg_match_all('/<li>(.*?)<\/li>/', $text, $result); 

我將得到一個包含Co的4行數組ntent1,內容2,...

爲什麼(。*)不工作,因爲這意味着match any character zero or more times

回答

19

*貪婪時尚比賽,在非貪婪時尚*?匹配。

這意味着該.*許多字符可能的,包括所有中間</li><li>對匹配,只有在</li>最後一次出現停止。另一方面,.*?將盡可能匹配爲幾個個字符,在第一次出現</li>時停止。

6

因爲.*本身是貪婪的並儘可能多地吃掉(即直到最後</li>),同時仍然允許模式匹配。另一方面,.*?並不貪婪,儘可能少吃(首先停止</li>)。

3

請參閱this有關正則表達式貪婪的文章部分。

+0

謝謝,非常有用的鏈接 – EBAG 2010-04-07 11:53:51