贪婪量词匹配两个连续的段,而不是进行两个单独的匹配

发布于 2024-10-30 22:31:18 字数 690 浏览 1 评论 0原文

这是我正在使用的代码;

$string = "[if-protectDelete-{0}-][data]name[/data] can be deleted[/elseif][elseif-{1}-][data]name[/data] can't be deleted[/elseif][elseif-{2}-]No data[/elseif][/endif]";

if (preg_match_all("#\[elseif-\{(.+)\}-\](.+?)\[/elseif\]#", $string, $matches)) {
    dumper($matches[0]);
}

$matches[0] 输出为;

array(1) {
  [0]=> string(75) "[elseif-{1}-]PHP REGEX can't be deleted[/elseif][elseif-{2}-]No data[/elseif]"
}

我可以得到正确的 if 部分,但是 elseif...我想这是完全不同的场景。 不应该这样输出吗?

array {
  [0] => "[elseif-{1}-]PHP REGEX can't be deleted[/elseif]",
  [1] => "[elseif-{2}-]No data[/elseif]"
}

Here is the code I'm using;

$string = "[if-protectDelete-{0}-][data]name[/data] can be deleted[/elseif][elseif-{1}-][data]name[/data] can't be deleted[/elseif][elseif-{2}-]No data[/elseif][/endif]";

if (preg_match_all("#\[elseif-\{(.+)\}-\](.+?)\[/elseif\]#", $string, $matches)) {
    dumper($matches[0]);
}

$matches[0] output is;

array(1) {
  [0]=> string(75) "[elseif-{1}-]PHP REGEX can't be deleted[/elseif][elseif-{2}-]No data[/elseif]"
}

I can get the part right for if, but elseif... It is totally different scenario I guess.
Shouldn't it output like this?

array {
  [0] => "[elseif-{1}-]PHP REGEX can't be deleted[/elseif]",
  [1] => "[elseif-{2}-]No data[/elseif]"
}

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

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

发布评论

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

评论(3

雪花飘飘的天空 2024-11-06 22:31:18

只需添加?

your : \[elseif-\{(.+)\}-\](.+?)\[/elseif\]
right: \[elseif-\{(.+?)\}-\](.+?)\[/elseif\]

Just add ?

your : \[elseif-\{(.+)\}-\](.+?)\[/elseif\]
right: \[elseif-\{(.+?)\}-\](.+?)\[/elseif\]
橙幽之幻 2024-11-06 22:31:18

我不知道 dumper 做什么,但数组 $matches 包含 $matches[0] 中的整个匹配以及 $matches[0] 中捕获的组code>$matches[1] $matches[2] ...

所以你应该这样做: print_r($matches); 来获取你的匹配组。

I don't know what dumper do but the array $matches contains the whole matching in $matches[0] and the groups captured in $matches[1] $matches[2] ...

so you should do : print_r($matches); to get your matches groups.

夜雨飘雪 2024-11-06 22:31:18

看起来你仍然有一个贪婪的 + 。这可能会解决这个问题:

#\[elseif-\{([0-9]+)\}-\](.+?)\[/elseif\]#

注意 [0-9]+ 替换了 .+。让我知道进展如何。


假设大括号内可能有任何内容,除了其他大括号之外,这会更好:

#\[elseif-\{([^}]+)\}-\](.+?)\[/elseif\]#

或者,就像您提到的: .+?

It looks like you still have a greedy + in there. This might fix it:

#\[elseif-\{([0-9]+)\}-\](.+?)\[/elseif\]#

Notice the [0-9]+ that replaces the .+. Let me know how that goes.


Assuming you might have anything inside the curly braces, except other curly breaces, this would be even better:

#\[elseif-\{([^}]+)\}-\](.+?)\[/elseif\]#

Or, like you mentioned: .+?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文