php - 创建一个简单但灵活的模板引擎

标签 php regex templating-engine

我正在尝试构建一个基本的模板引擎。就像已经作为开源提供的模板引擎一样,我正在使用搜索和替换技术。

但是,由于搜索和替换必须进行硬编码,因此不太灵活。我的意思是,作为一个例子,我正在使用这样的东西

$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/

相关文章:

php - 尝试将变量打印到 HTML 中时 undefined variable

php - 为什么 Internet Explorer 9 在 UTF8 和空白内容上显示奇怪的字符?

php - Laravel 获取用户今天和明天生日

Python 正则表达式先行非 ASCII 字符

ruby-on-rails - 如何用液体覆盖 erb?

handlebars.js - Mustache.js 和 Handlebars.js 有什么区别?

php - 为什么我不能运行两个 mysqli 查询?第二个失败

c# - 在 C# 上表示通配符

Python正则表达式: remove non-ASCII characters and words ending in number

haml - HAML,SASS/compass 和ERB之间的主要区别是什么?