0

文字列内のすべての一致を検索しようとしています。何らかの理由で、私の一致が文字列の先頭にある場合、その特定の一致は返されません。インデックス0と関係がありますか?また、PREG_OFFSET_CAPTUREを使用して、インデックスと一致を取得しています。以下は、動作しない動作のコードです。

$text = '[QUOTE]I wonder why[QUOTE]PHP[IMG]hates me[/IMG][/QUOTE][/QUOTE][URL="http://www.bing.com"]Click me![QUOTE]........[/QUOTE]Ok Bai![/URL]';
preg_match_all('#\[QUOTE\]#', $text, $matches, PREG_OFFSET_CAPTURE, PREG_PATTERN_ORDER);
print_r($matches);

その結果は次のとおりです。

配列([0] =>配列([0] =>配列([0] => [QUOTE] [1] => 19)[1] =>配列([0] => [QUOTE] [1] = > 100))))

ご覧のとおり、一致するものは2つだけです。文字列の先頭に文字を追加すると、3つすべてが見つかります。

$text = 'a[QUOTE]I wonder why[QUOTE]PHP[IMG]hates me[/IMG][/QUOTE][/QUOTE][URL="http://www.bing.com"]Click me![QUOTE]........[/QUOTE]Ok Bai![/URL]';
preg_match_all('#\[QUOTE\]#', $text, $matches, PREG_OFFSET_CAPTURE, PREG_PATTERN_ORDER);
print_r($matches);

その結果は次のとおりです。

配列([0] =>配列([0] =>配列([0] => [QUOTE] [1] => 1)[1] =>配列([0] => [QUOTE] [1] = > 20)[2] =>配列([0] => [QUOTE] [1] => 101)))

3つすべての試合。誰かが私の正規表現を変更する必要があるかどうか、または私が気付いていないいくつかの癖があるかどうかを理解するのを手伝ってくれるなら、それは大いにありがたいです。Pythonとreライブラリを利用してこれと同じことを試しましたが、すべての一致が返されます。また、このhttp://www.regextester.com/を利用しましたが、両方のシナリオで機能し、すべてが適切に一致していると報告されています。私の唯一の推測は、PREG_OFFSET_CAPTUREが位置0と0で一致を見つけて問題を引き起こしていることと関係があります。

よろしくお願いします!

4

2 に答える 2

3

複数のフラグを追加する正しい方法は、パイプ|を使用することです。

preg_match_all('#\[QUOTE\]#', $text, $matches, PREG_OFFSET_CAPTURE | PREG_PATTERN_ORDER);

,beforePREG_PATTERN_ORDERは、それが'offset'パラメーター(文字列の開始点)になることを意味し、PREG_PATTERN_ORDER == 1として、2番目の文字から開始します。

于 2013-03-06T20:18:11.683 に答える
0

問題は関数呼び出しにあります:

preg_match_all('#\[QUOTE\]#', $text, $matches, PREG_OFFSET_CAPTURE, PREG_PATTERN_ORDER);

5番目のパラメーターはオフセットであり、別のフラグではありません。

于 2013-03-06T20:18:19.803 に答える