Preg 匹配除字符串之外的所有贪婪匹配

发布于 2024-09-17 11:03:04 字数 972 浏览 11 评论 0原文

我的源字符串是这样的:

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

        )
)

My source string is this:

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

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

My regex is this:

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

Which results in:

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}

        )
)

You can see that the greediness is too greedy, and it goes all the way to the end of the second instance. What I'm expecting is this:

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

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

        )
)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

优雅的叶子 2024-09-24 11:03:08

同意@user779

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

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

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

Agree with @user779

Also another way is to add a U (PCRE_UNGREEDY) modifier at the end of your regexp which makes all quantifiers lazy.

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

More info here: http://php.net/manual/en/reference.pcre.pattern.modifiers.php

趴在窗边数星星i 2024-09-24 11:03:07
.*  greedy
.*? non-greedy
.*  greedy
.*? non-greedy
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文