Php 递归正则表达式与模板块不匹配
我试图了解更多关于正则表达式的知识,在本例中,您可以在正则表达式中执行递归 我正在尝试匹配Php 递归正则表达式与模板块不匹配,php,regex,pcre,Php,Regex,Pcre,我试图了解更多关于正则表达式的知识,在本例中,您可以在正则表达式中执行递归 我正在尝试匹配{foreach$VAR}的嵌套块。。。{/foreach}。但由于某些原因,我的正则表达式不匹配,我不明白为什么 我希望这里的任何人都能对此有所了解。我对快速修复正则表达式不感兴趣。但实际上更多的是我的正则表达式没有达到我期望的效果。到底发生了什么 这是我的代码: <?php $str = 'start of text {foreach $ABC} in 1st loop {foreach
{foreach$VAR}的嵌套块。。。{/foreach}
。但由于某些原因,我的正则表达式不匹配,我不明白为什么
我希望这里的任何人都能对此有所了解。我对快速修复正则表达式不感兴趣。但实际上更多的是我的正则表达式没有达到我期望的效果。到底发生了什么
这是我的代码:
<?php
$str = 'start of text
{foreach $ABC}
in 1st loop
{foreach $XYZ}
in 2nd loop
{/foreach}
{/foreach}
some other stuff';
if ( preg_match ( '#{foreach \$.*?}((?!foreach)|(?R))*{/foreach}#', $str, $matches ) )
{
print_r($matches);
}
else
{
echo 'No match';
}
我认为正则表达式就是这样工作的。但显然情况并非如此。所以我的问题是,我的解释哪里错了
您可以在此处使用此代码:
我只是想澄清一下 我试图获取每个
foreach
块的内容。就我而言:
arr[0] => in 1st loop
{foreach $XYZ}
in 2nd loop
{/foreach}
arr[1] => in 2nd loop
或-
两者都可以。首先,
不匹配任何东西,但每个默认值都匹配换行符。要使其也匹配换行符,必须设置修饰符s
其次,在这里使用断言:((?!foreach)|(?R))*
,但没有要匹配的实际字符。在*
量词前至少需要一个点或其他东西
{foreach\$.*}((?!foreach){124;(?R)).{/foreach}s
在测试文本中给出以下结果:
Array
(
[0] => {foreach $ABC}
in 1st loop
{foreach $XYZ}
in 2nd loop
{/foreach}
{/foreach}
[1] =>
)
我忘了在我的帖子中添加
s
修饰符。但正如你所看到的,它就在代码板页面上。通过在星号前添加一个
,它确实会给出您显示的结果。但是为什么它没有捕获内部的{foreach$XYZ}
?我希望这个正则表达式能够做到这一点。也不确定空匹配来自哪里,有什么想法吗?没有捕获,因为您没有在子模式周围设置适当的捕获括号。该模式是否编译<代码>{和}
是regex-land中的特殊字符。@KennethK。是的,看起来不错。当我逃离他们时,我也看不出有什么不同。但也许从现在开始我还是这样做更好。
arr[0] => {foreach $ABC}
in 1st loop
{foreach $XYZ}
in 2nd loop
{/foreach}
{/foreach}
arr[1] => {foreach $XYZ}
in 2nd loop
{/foreach}
Array
(
[0] => {foreach $ABC}
in 1st loop
{foreach $XYZ}
in 2nd loop
{/foreach}
{/foreach}
[1] =>
)