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
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);
我需要 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
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);