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 ) ) )

如您所见,它只找到了两个匹配项。如果我在字符串的开头添加一个字符,它将找到所有三个字符。

$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 ) ) )

全部三场比赛。如果有人可以帮助我弄清楚我的 REGEX 是否需要修改,或者是否有一些我不知道的怪癖,我将不胜感激。我已经使用 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);

,之前PREG_PATTERN_ORDER的意思是它成为'offset'参数(在字符串中的哪个点开始),并且作为PREG_PATTERN_ORDER==1,它从第二个字符开始。

于 2013-03-06T20:18:11.683 回答
0

问题出在您的函数调用中:

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

第五个参数是偏移量,而不是另一个标志。

于 2013-03-06T20:18:19.803 回答