【问题标题】:PHP preg_match_all not finding first matchPHP preg_match_all 找不到第一个匹配项
【发布时间】:2013-02-21 19:37:24
【问题描述】:

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

提前感谢您的帮助!

【问题讨论】:

    标签: php regex preg-match-all


    【解决方案1】:

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

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

    PREG_PATTERN_ORDER 之前的 , 意味着它成为“偏移”参数(字符串中的起始点),并且作为 PREG_PATTERN_ORDER==1,它从第二个字符开始。

    【讨论】:

    • 你是圣人 Wrikken,如果有办法给你小费,我会这样做:D
    【解决方案2】:

    问题出在你的function call:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-07
      • 2014-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多