我将HTML布局存储在MySQL数据库中。这些布局可能包含HTML中的标签,如下所示..
{site.poll="fred,joe,john"}
和
{site.layout.header}
目前我正在搜索HTML模板,通过执行多个preg_matches来识别标签,循环遍历数组然后执行str_replace(),替换为另外的部分html模板也从数据库中撤回..示例如下..
if (preg_match_all('/{site\.layout\.(.)*}/', $data, $match) != FALSE)
{
foreach($match[0] as $value)
{
$value = trim($value, '{}');
$tmp_store = explode('.', $value);
$tmp_partial = $this->parse($this->get_layout(end($tmp_store)));
$data = str_replace('{'. $value .'}', $tmp_partial, $data);
}
}
我需要为我需要的每个标记执行一个正则表达式,然后在该标记的每个实例上执行str_replace ..同样需要为每个所需的部分模板执行相同的操作。 对我而言,这似乎都很重......
有更好的方法吗?
提前致谢..
编辑:我不想使用现有的库,我想自己完成这项任务并在此过程中学习..
答案 0 :(得分:5)
您可以使用preg_replace
一次性查找和替换您的代码。
我认为最好的方法是使用现有的模板系统,如Twig或Smarty。我确信您可以将数据读入Smarty(它不必来自文件)。我敢肯定Twig有类似的东西。
Twig和Smarty还提供缓存选项,因此您不会在每次请求时重建模板。但是,如果模板存储在文件中,它们的效果最佳。
如果你真的必须推出自己的模板系统,你应该构建一种实际上逐个字符地检查内容的解析器。这可能比正则表达式更快更准确(虽然更复杂)
答案 1 :(得分:2)
我不希望这回答你的问题,但认为它可能会给你一些别的想法。当我的模板类过度使用时,我得到了一些代码。
function replace_tags(&$xhtml, $tags) {
if( is_array($tags) && count($tags) > 0 )
foreach ($tags as $tag => $data) {
$xhtml = str_replace("{{" . $tag . "}}", $data, $xhtml);
}
if( $xhtml ) return $xhtml;
}
$tpl = "/templates/index.xhtml";
$tags = array(
"css" => null,
"js" => null,
"main_content" => null
);
$tags['main_content'] = file_get_contents("/home/main.xhtml");
echo replace_tags(file_get_contents($tpl), $tags);
编辑
以为我会澄清函数通过引用接收$ xhtml的原因,并且还返回$ xhtml。基本上只是为了达到双重目的。
//Usage at the end of a page
echo replace_tags(file_get_contents($tpl), $tags);
//Usage for template in template
$tags['menu'] = file_get_contents($menu_tpl);
replace_tags($tags['menu'], $tags);
echo replace_tags(file_get_contents($tpl), $tags);