(。*) 代替 (。*?)

时间:2010-04-07 11:16:59

标签: php regex

假设我们有这个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);

我将得到一个包含4行的数组,其中包含Content1,Content2,......

为什么(。*)无效,因为它意味着match any character zero or more times

3 个答案:

答案 0 :(得分:20)

*贪婪方式匹配,*?非贪婪方式匹配。

这意味着.*将匹配为多个字符,包括所有中间</li><li>对,仅在</li>的最后一次出现时停止。另一方面,.*?将匹配为少数字符,在第一次出现</li>时停止。

答案 1 :(得分:6)

因为.*本身是贪婪的并且尽可能多地吃掉(即直到最后</li>),同时仍然允许模式匹配。另一方面,.*?并不贪婪,尽可能少地吃掉(先停在</li>)。

答案 2 :(得分:3)

请参阅this文章部分,了解正则表达式的优缺点。