匹配第一次出现的正则表达式问题

时间:2012-04-27 10:17:56

标签: php regex

任何人都可以告诉我这个正则表达式有什么问题:

它意味着返回第一次出现的颜色,但不断返回最后一次。

$string = "Red is a sexy colour. Yellow too. Pink too. Blue too. Green too. Hehe.";

preg_match('/^.*\b(red|green|blue|yellow)\b.*$/i', $string, $colour );

echo $colour[1]; // Should say Red, but returns Green... o.O
$ color上的

print_r显示:

Array ( [0] => Red is a sexy colour. Yellow too. Pink too. Blue too. Green too. Hehe.
        [1] => Green )

3 个答案:

答案 0 :(得分:3)

您可以在图案和锚点之前和之后移除填充物,而不是在图案不合格之前填充填充物:

preg_match('/\b(red|green|blue|yellow)\b/i', $string, $colour);

将返回第一场比赛。

答案 1 :(得分:2)

不,不应该。关键是正则表达式引擎首先尝试匹配源字符串中尽可能多的字母给出的模式。默认情况下它非常贪婪。 )

换句话说,您指定的模式将尝试从字符串的 end 中查找四个颜色的单词。您可以将其设置为非贪婪(通过将.*替换为.*?) - 或者尝试完全改变您的模式。

我看到^和$标记有一点用处,后跟。*,例如,如果你只是在寻找这些单词,为什么不使用像...这样简单的东西...

/\b(red|green|blue|yellow)\b/

答案 2 :(得分:1)

你的.*部分是贪婪的,即。它在颜色名称出现之前尽可能匹配。要将其更改为非贪婪使用.*?

preg_match('/^.*?\b(red|green|blue|yellow)\b.*$/i', $string, $colour );