2010-04-07 87 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