Php preg_match_all只返回一个匹配

Php preg_match_all只返回一个匹配,php,regex,preg-match-all,Php,Regex,Preg Match All,我需要一个php preg_match_all函数的模式来返回双大括号内的、介于“”和“”字符串之间的匹配项 我试图创建这样一个模式,但它只返回一个匹配。我希望它返回“星期一”和“星期二”,但它只返回“星期二” 这是模式 /<body>(.)*{{(?<DAY>.*?)}}(.)*<\/body>/s /(.)*{{(?.*?}}(.)*/s 以下是用于测试的字符串: <body> s{s ds ds{{Monday}}ds s dsd}{s

我需要一个php preg_match_all函数的模式来返回双大括号内的、介于“”和“”字符串之间的匹配项

我试图创建这样一个模式,但它只返回一个匹配。我希望它返回“星期一”和“星期二”,但它只返回“星期二”

这是模式

/<body>(.)*{{(?<DAY>.*?)}}(.)*<\/body>/s
/(.)*{{(?.*?}}(.)*/s
以下是用于测试的字符串:

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


}
{
fdsa dsafasd
</body>

s{s ds
ds{{周一}}ds
s
dsd}{s
星期二
d{}sd}s
}
{
fdsa-dsafasd

谢谢

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

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

它只返回一个匹配的原因是,从
元素的开始到
元素的结束,您只使用一个捕获组进行匹配

要解决此问题,可以使用,以便在上一次匹配结束时继续匹配:

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

preg|u match_all(“/|(?!^)\G(.*{{(?.*}}(?=.*)/s“,$input,$matches,preg|u SET_顺序);
foreach($matches作为$match进行匹配){
如果(isset($match['DAY'])){
echo$match['DAY'];
}
}
基于您提供的输入的输出:

星期一星期二


值得指出的是,如果您知道这些匹配项中的每一项都在
元素中,您只需使用:

preg_match_all("/{{(?<DAY>.*?)}}/", $input, $matches, PREG_SET_ORDER);
preg_match_all(“/{{(?.*?}}}}/”,$input,$matches,preg_SET_顺序);

否,匹配将在正文标记和正文外。例如,在网页代码的标题部分。感谢您的工作模式。关于此部分的一个问题:“(?!^)”。这是否意味着测试字符串开头没有任何内容?@trzcy
\G
锚定将在上一个匹配结束时继续匹配,或者将从字符串开头开始匹配。负前瞻
(?!^)
只是防止它在开始时匹配,这样匹配总是从
开始,并且
\G
总是从那里继续。如果
元素中有匹配项,它似乎可以工作。Josh,非常感谢您的帮助!
preg_match_all("/{{(?<DAY>.*?)}}/", $input, $matches, PREG_SET_ORDER);