preg_match匹配所有起始单词

时间:2013-03-11 21:52:22

标签: php regex preg-match preg-match-all

我试图从一系列单词中获取所有匹配的模式;

$pattern = '/^(ab|abc|abcd|asdf)/';
preg_match_all($pattern, 'abcdefgh', $matches);

我想得到' ab,abc和abcd '

但这只返回' ab '。如果我在爆炸后循环遍历模式,它就可以工作。

有没有办法通过单一匹配来解决它?

1 个答案:

答案 0 :(得分:2)

正则表达式消耗字符,因为它们通过字符串匹配,因此它们无法原生地找到重叠匹配。

您可以使用超前断言和捕获组等扩展功能,但这需要一个丑陋的构造:

preg_match_all(
    '/^
    (?:(?=(ab)))?
    (?:(?=(abc)))?
    (?:(?=(abcd)))?
    (?:(?=(asdf)))?
    /x', 
    $subject, $result, PREG_SET_ORDER);
for ($matchi = 0; $matchi < count($result); $matchi++) {
    for ($backrefi = 0; $backrefi < count($result[$matchi]); $backrefi++) {
        # Matched text = $result[$matchi][$backrefi];
    } 
}