Предположим, что у нас есть это содержимое 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
*
соответствует жадным , *?
соответствует не жадным .
Это означает, что . *
будет соответствовать как можно многим символам, включая все промежуточные пары
, только остановка при последнем появлении
. С другой стороны, . *?
будет соответствовать как немногим символам, насколько это возможно, останавливаясь при первом появлении
.
Потому что . *
сам по себе жадный и съедает столько, сколько может (т.е. до последнего li >
), позволяя шаблону совпадать. . *?
с другой стороны, не является жадным и съедает как можно меньше (сначала останавливается
).
См. раздел этой статьи о жадности регулярных выражений.