我正在尝试构建一个基本的模板引擎。就像已经作为开源提供的模板引擎一样,我正在使用搜索和替换技术。
但是,由于搜索和替换必须进行硬编码,因此不太灵活。我的意思是,作为一个例子,我正在使用这样的东西
$templateMarkup = '<div class="title">{_TITLE_}</div>';
$renderedMarkup = str_replace("{_TITLE_}",$title,$templateMarkup);
echo $renderedMarkup;
如您所见,它是硬编码的。因此,我必须有意识地了解所有占位符才能完成成功的渲染。
我的正则表达式有点弱。但我知道,如果我可以开发一个正则表达式,它可以匹配所有以 {_
开头并以 _}
结尾的文本并获取它们之间的值,我可能会能够创建灵活的模板引擎。
我需要有关正则表达式的帮助。
如果我完全走错了方法来完成任务,请警告我。
<子> 对于那些认为我在重新发明轮子的人。这是我的解释
Templating engines, that are already available are quite unnecessarily complex.
My requirements are simple and so I am builidng my own simple engine.
最佳答案
如果您的模板标签只有一个单词,您要查找的正则表达式是 {_(\w+)_}
。你可以像这样使用它:
<?php
$replacements = array(
"firstname" => "John",
"lastname" => "Smith"
);
$template_markup = "Hello {_firstname_} {_lastname_}";
if(preg_match_all('/{_(\w+)_}/', $template_markup, $matches)) {
foreach($matches[1] as $m) {
$template_markup = str_replace("{_".$m."_}", $replacements[$m], $template_markup);
}
}
echo $template_markup;
?>
您会看到 preg_match_all
正则表达式周围有正斜杠,这些是分隔符。
更新:如果您想将正则表达式扩展到单个单词之外,那么在使用 .
匹配任何字符时要小心。最好使用类似这样的内容来指定要包含其他字符:{_([\w-_]+)_}
。 [\w-_]
表示它将匹配字母数字字符、连字符或下划线。
(也许有人可以解释为什么使用 .
可能是一个坏主意?我不是 100% 确定)。
关于php - 创建一个简单但灵活的模板引擎,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5815028/