我需要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>
谢谢
答案 0 :(得分:2)
它只返回一个匹配的原因是因为您从<body>
元素的开头到只有一个捕获组的</body>
元素的关闭匹配
要解决此问题,您可以使用\G
anchor以便在上一场比赛结束时继续匹配:
/<body>|(?!^)\G(.*?){{(?<DAY>.*?)}}(?=.*<\/body>)/s
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