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

いいえ、そうすべきではありません。ポイントは、正規表現エンジンが最初に、ソース文字列内のできるだけ多くの文字で指定されたパターンと一致しようとすることです。デフォルトでは非常に貪欲です。)

つまり、指定したパターンは、文字列の末尾から 4 つの色の単語を検索しようとします。.*(最初をに置き換えることで) 非貪欲にするか.*?、パターンを完全に再構築することができます。

^ マーカーと $ マーカーの後に .* が続く使い方が少し見られます。

/\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 に答える