PHP标签替换方法

时间:2012-02-29 20:59:19

标签: php html tags preg-match-all str-replace

我将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 ..同样需要为每个所需的部分模板执行相同的操作。 对我而言,这似乎都很重......

有更好的方法吗?

提前致谢..

编辑:我不想使用现有的库,我想自己完成这项任务并在此过程中学习..

2 个答案:

答案 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);