Preg соответствует всем жадным за исключением строки - PullRequest
0 голосов
/ 03 сентября 2010

Моя исходная строка:

{categories group_id="3"}
{category_name}
{/categories}

{categories group_id="4"}
{category_name}
{/categories}

Мое регулярное выражение таково:

preg_match('/{categories group_id="3"}(.*){\/categories}/s', $tagdata, $matches);

Что приводит к:

Array
(
    [0] => Array
        (
            [0] => {categories group_id="3"}
    {category_name}
    {/categories}
    {categories group_id="4"}
    {category_name}
    {/categories}
        )

    [1] => Array
        (
            [0] => 
    {category_name}
    {/categories}
    {categories group_id="4"}
    {category_name}

        )
)

Вы можете видеть, что жадность слишком жадная, и она продолжается вплоть до конца второго экземпляра. То, что я ожидаю, это:

Array
(
    [0] => Array
        (
            [0] => {categories group_id="3"}
    {category_name}
    {/categories}
        )

    [1] => Array
        (
            [0] => 
    {category_name}

        )
)

Ответы [ 2 ]

3 голосов
/ 03 сентября 2010
.*  greedy
.*? non-greedy
0 голосов
/ 15 ноября 2012

Согласен с @ user779

Также еще один способ - добавить модификатор U (PCRE_UNGREEDY) в конце вашего регулярного выражения, который делает все квантификаторы ленивыми .

preg_match('/{categories group_id="3"}(.*){\/categories}/sU', $tagdata, $matches);

Подробнее здесь: http://php.net/manual/en/reference.pcre.pattern.modifiers.php

...