preg_match_all只返回一个匹配项

时间:2016-02-21 02:30:04

标签: php regex preg-match-all

我需要php preg_match_all函数的模式来返回双花括号内的匹配并位于'< body>'之间和'< / body>'字符串。

我试图创建这样的模式,但它只返回一个匹配。我预计它将返回'周一'和'周二',但它只返回'周二'。

这是模式

/<body>(.)*{{(?<DAY>.*?)}}(.)*<\/body>/s

以下是测试字符串:

<body>
s{s ds
ds{{Monday}}ds
s
dsd}{s
ds{{Tuesday}}dsd sdsd
d{}sd}s


}
{
fdsa dsafasd
</body>

谢谢

2 个答案:

答案 0 :(得分:2)

它只返回一个匹配的原因是因为您从<body>元素的开头到只有一个捕获组的</body>元素的关闭匹配

要解决此问题,您可以使用\G anchor以便在上一场比赛结束时继续匹配:

/<body>|(?!^)\G(.*?){{(?<DAY>.*?)}}(?=.*<\/body>)/s

Live Example

preg_match_all("/<body>|(?!^)\G(.*?){{(?<DAY>.*?)}}(?=.*<\/body>)/s", $input, $matches, PREG_SET_ORDER);

foreach ($matches as $match) {
    if (isset($match['DAY'])) {
        echo $match['DAY'];
    }
}

根据您提供的输入输出:

  周一周一

值得指出的是 if 你知道每个匹配都在<body>元素中,你可以简单地使用:

preg_match_all("/{{(?<DAY>.*?)}}/", $input, $matches, PREG_SET_ORDER);

答案 1 :(得分:0)

我认为更简单的方法是在第一步中获取body标签之间的文本。使用第二个正则表达式,您可以使用花括号中的元素进行检索

/({{(Monday|Tuesday)}})+/s