preg_match_all returns 只有一场比赛

preg_match_all returns only one match

我需要 php preg_match_all 函数的模式来 return 匹配双花括号内和 '' 和 '' 字符串之间的匹配项.

我试图创建这样一个模式,但它 return 只匹配了一个。我预计它会 return 'Monday' 和 'Tuesday' 但它 return 只 'Tuesday'.

这是模式

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

这里是测试字符串:

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


}
{
fdsa dsafasd
</body>

谢谢

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

中的元素
/({{(Monday|Tuesday)}})+/s

它只返回一个匹配项的原因是因为您从 <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'];
    }
}

基于您提供的输入的输出:

Monday Tuesday


值得指出的是 如果 您知道每个匹配项都在 <body> 元素内,您可以简单地使用:

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