PHP preg_match_all找不到第一个匹配项

时间:2013-03-06 20:13:11

标签: php regex preg-match-all

我正在尝试在字符串中查找所有匹配项。出于某种原因,如果我的匹配位于字符串的开头,则不会返回该特定匹配。它与索引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导致某些问题。

提前感谢您的任何帮助!

2 个答案:

答案 0 :(得分:3)

添加多个标志的正确方法是使用管道|,所以:

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

,之前的PREG_PATTERN_ORDER表示它成为'offset'参数(在字符串中的哪一点开始),而PREG_PATTERN_ORDER == 1,它从第二个字符开始。

答案 1 :(得分:0)

问题出在您的function call

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

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