假设我们有这个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
答案 0 :(得分:20)
*
以贪婪方式匹配,*?
以非贪婪方式匹配。
这意味着.*
将匹配为多个字符,包括所有中间</li><li>
对,仅在</li>
的最后一次出现时停止。另一方面,.*?
将匹配为少数字符,在第一次出现</li>
时停止。
答案 1 :(得分:6)
因为.*
本身是贪婪的并且尽可能多地吃掉(即直到最后</li>
),同时仍然允许模式匹配。另一方面,.*?
并不贪婪,尽可能少地吃掉(先停在</li>
)。
答案 2 :(得分:3)
请参阅this文章部分,了解正则表达式的优缺点。