为什么带有前导和尾随 .* 的正则表达式模式只能进行一次替换?

问题描述 投票:0回答:1

我正在开发一个简单的模板引擎,并尝试实现我自己的简单语法来处理循环,并最终实现

if
语句,而不是在我的模板文件中包含 PHP。

我知道很多人会说不要打扰或只使用现有的系统,但由于这是我的论文,我希望尽可能多的是我自己的工作!

无论如何,回到问题上来。我的模板文件中有以下代码作为示例:

<p>Template Header</p>
{{foreach{array1}}}
    <p>This is the first content line that should be displayed.</p>
{{/foreach}}
{{foreach{array2}}}
    <p>This is the second content line that should be displayed.</p>
{{/foreach}}
<p>Template Footer</p>

然后我使用以下 PHP 来读取文件、查找循环并提取它们。

<?php
$template = file_get_contents('reg.html');
$expression = "#.*{{foreach{(.*?)}}}(.*?){{/foreach}}.*#is";
$result = preg_replace($expression, "$1", $template);  
var_dump($result);
?>

当调用

preg_replace()
并转储结果 $1 时,会给出将用于循环的数组名称(array1 或 array2),然后将其更改为 $2 将给出循环标记之间的内容。完美的。问题是它只适用于一个
{{foreach}}
标签。

我是否可以循环正则表达式的所有匹配以获得上面得到的结果?

php regex replace placeholder
1个回答
1
投票
$expression = "#.*{{foreach{(.*?)}}}(.*?){{/foreach}}.*#is";
                ^^                                   ^^

您不仅匹配“foreach”模板标签,还匹配它之前和之后的所有内容。这意味着第二个 foreach 也会被

.*
吃掉。所以你不能再匹配了。

© www.soinside.com 2019 - 2024. All rights reserved.