【问题标题】:Preg match all greedy with exception for stringPreg 匹配所有贪心,但字符串除外
【发布时间】:2010-09-03 19:23:43
【问题描述】:

我的源字符串是这样的:

{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}

        )
)

【问题讨论】:

    标签: php regex preg-match-all regex-greedy


    【解决方案1】:
    .*  greedy
    .*? non-greedy
    

    【讨论】:

      【解决方案2】:

      同意@user779

      另外一种方法是在你的正则表达式末尾添加一个 U (PCRE_UNGREEDY) 修饰符,使所有量词变得懒惰

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

      更多信息在这里:http://php.net/manual/en/reference.pcre.pattern.modifiers.php

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多