1

PHP の を使用して、特定の単語のすべてのインデックスを文字列から抽出しようとしていますpreg_match。たとえば、hello次の単語を考えてみましょう。

$r = "/\b(hello)\b/u";

この文字列でそれを探したいとしましょう:

$s = 'hello. how are you, hello there. helloorona!';

パラメータを指定して実行preg_matchし、PREG_OFFSET_CAPTURE$matches という配列を渡すと、

preg_match($r, $s, $matches, PREG_OFFSET_CAPTURE);

次のようなものが返されることを期待しています (つまり、最後の "hellooroona" フレーズを無視します)。

["hello", 0], ["hello", 20]

しかし実際には、すべての一致を$matches介してjson_encode、またはループすることによって値をエコーし​​て返すと、返される値は常に次のようになります。

["hello", 0], ["hello", 0]

これを同様の文字列で実行すると、たとえば

$s = 'how are you, hello there.';

答えは

["hello", 13]

どちらが正しい。実行するとhello hello hello、3 つのインデックスがすべて 0 になります。

概要

したがって、インデックス カウンターは常に最初のインデックスを返すだけのようです。これは予想される動作ですか?実際のインデックスを取得するにはどうすればよいですか?

4

2 に答える 2

1

2 番目["hello", 0]は文字列の 2 番目の hello ではなく、サブグループの一致です。

これを使用preg_match_allすると、期待される結果が得られます。

// note: sub group is not necessary
$r = "/\bhello\b/u";
$s = 'hello. how are you, hello there. helloorona!';
preg_match_all($r, $s, $matches, PREG_OFFSET_CAPTURE);
于 2013-08-26T07:07:46.843 に答える