我正在尝试在字符串中查找所有匹配项。出于某种原因,如果我的匹配位于字符串的开头,则不会返回该特定匹配。它与索引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导致某些问题。
提前感谢您的任何帮助!
答案 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);
第五个参数是偏移量,而不是另一个标志。