【发布时间】:2019-12-09 12:13:07
【问题描述】:
我正在为一个应用程序创建模块,该模块将具有简单的自定义模板,其中包含将被数据库中的数据替换的标签。此模块的每个实例中的字段名称将不同。我想知道是否有更好的方法来做到这一点。
下面的代码是我想出的,但我相信一定有更好的方法。我在 preg_split 和 preg_match_all 上苦苦挣扎,刚刚达到了我的极限,所以我以愚蠢的方式做到了。
<?php
$customTemplate = "
<div>
<<This>>
<<that>>
</div>
";
function process_template ($template, $begin = '<<', $end = '>>') {
$begin_exploded = explode($begin, $template);
if (is_array($begin_exploded)) {
foreach ($begin_exploded as $key1 => $value1) {
$end_exploded = explode($end, $value1);
if (is_array($end_exploded)) {
foreach ($end_exploded as $key2 => $value2) {
$tag = $begin.$value2.$end;
$variable = trim($value2);
$find_it = strpos($template,$tag);
if ($find_it !== false) {
//str_replace ($tag, $MyClass->get($variable), $template );
$template = str_replace ($tag, $variable, $template);
}
}
}
}
}
return $template;
}
echo(process_template($customTemplate));
/* Will Echo
<div>
This
that
</div>
*/
?>
以后我会连接 $MyClass->get() 来用正确的数据替换标签。并且自定义模板将由用户构建。
【问题讨论】:
-
有php模板引擎,不用自己写,
-
更不用说,php 是 本身就是一种简单的模板语言。如果您将逻辑与视图分离,那么剩下的就是循环和打印变量。您的视图可能(应该?)都是 html,只有 php 是单行的,例如
<?php while($row=$someObj->nextRow(): ?>和<li><?= $row->varName ?></li> -
注意
explode()总是返回一个数组,两个is_array()测试是不需要的。 -
@TimMorton 我不希望用户必须了解任何关于 php 的知识才能将变量添加到模板,只需简单的可识别标签。谢谢您的意见。我会考虑的。
标签: php regex str-replace explode templating