(.*) вместо (.*?)

Предположим, что у нас есть это содержимое 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

8
задан EBAG 7 April 2010 в 11:16
поделиться

3 ответа

* соответствует жадным , *? соответствует не жадным .

Это означает, что . * будет соответствовать как можно многим символам, включая все промежуточные пары

  • , только остановка при последнем появлении
  • . С другой стороны, . *? будет соответствовать как немногим символам, насколько это возможно, останавливаясь при первом появлении .

    20
    ответ дан 5 December 2019 в 05:44
    поделиться

    Потому что . * сам по себе жадный и съедает столько, сколько может (т.е. до последнего ), позволяя шаблону совпадать. . *? с другой стороны, не является жадным и съедает как можно меньше (сначала останавливается ).

    6
    ответ дан 5 December 2019 в 05:44
    поделиться

    См. раздел этой статьи о жадности регулярных выражений.

    3
    ответ дан 5 December 2019 в 05:44
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: