我正在开发一个简单的模板引擎,并尝试实现我自己的简单语法来处理循环,并最终实现
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}}
标签。
我是否可以循环正则表达式的所有匹配以获得上面得到的结果?
$expression = "#.*{{foreach{(.*?)}}}(.*?){{/foreach}}.*#is";
^^ ^^
您不仅匹配“foreach”模板标签,还匹配它之前和之后的所有内容。这意味着第二个 foreach 也会被
.*
吃掉。所以你不能再匹配了。