0

谁能告诉我这个正则表达式有什么问题:

它旨在返回第一次出现的颜色,但一直返回最后一次出现。

$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

$colour 上的 print_r 显示:

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

3 回答 3

3

除了使图案之前的填充物变得不贪婪之外,您还可以在图案和锚点之前和之后移除填充物:

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

将返回第一场比赛。

于 2012-04-27T10:26:20.227 回答
2

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

换句话说,您指定的模式将尝试从字符串末尾查找四个颜色的单词。您可以使其不贪婪(通过首先替换.*.*?) - 或尝试完全改革您的模式。

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

/\b(red|green|blue|yellow)\b/
于 2012-04-27T10:25:46.850 回答
1

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

preg_match('/^.*?\b(red|green|blue|yellow)\b.*$/i', $string, $colour );
于 2012-04-27T10:20:52.627 回答