PHP正则表达式问题,无法做到正确

时间:2011-04-06 15:26:46

标签: php regex

我遇到了正则表达式的问题(是的,有一天,我必须坐下来阅读它)。 这是我正在使用的代码;

$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获得正确的部分,但是如果......我猜这是完全不同的情况。 不应该这样吗? ;

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

如果有人能解决我的问题,我会很高兴。

3 个答案:

答案 0 :(得分:1)

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

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

请注意替换[0-9]+的{​​{1}}。让我知道这是怎么回事。


假设你可能在花括号内有任何东西,除了其他卷曲的花边,这会更好:

.+

或者,就像你提到的那样:#\[elseif-\{([^}]+)\}-\](.+?)\[/elseif\]#

答案 1 :(得分:1)

只需添加?

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

答案 2 :(得分:1)

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

所以你应该:print_r($matches);来获得你的比赛组。