【问题标题】:PHP tag replacement methodPHP标签替换方法
【发布时间】:2012-02-29 20:59:18
【问题描述】:

我在 MySQL 数据库中存储 HTML 布局。这些布局可能包含 HTML 中的标签,如下所示..

{site.poll="fred,joe,john"}

{site.layout.header}

目前我正在通过执行多个 preg_matches 来识别标签来搜索 HTML 模板,遍历数组然后执行 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。对于每个所需的部分模板,同样需要做同样的事情。 对我来说,这一切似乎都变得沉重..

有更好的方法吗?

提前谢谢..

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

【问题讨论】:

  • 是您使用 preg_match_all 收集模板中所有标签的唯一原因吗?通常,您的代码会有一个需要进入模板的标签列表。将数据数组/对象推送到模板中不是更有效吗?然后只需 str_replace 你所拥有的。如果您担心残留的标签,请在最后进行扫描以用空白清除它们。
  • mmm.. 看看你的 $tmp_partial 行。看起来你的框架是我的倒退。您是否通过模板中的标签加载所需的 html/data 片段?我首先收集所有数据,然后遍历数组 str_replace-ing 每个标签,因为逻辑是用模板构建的,所以不应该有任何杂散标签(我使用基本 IE:array('head'=>' ','body'=>'') 所以从一开始就涵盖了所有内容。
  • 差不多,我正计划将 HTML 一起从 DB 中取出,然后循环替换所有标签实例..
  • 除非您更改设计,否则我想不出更好的方法,但我注意到一个小错误,您的正则表达式应该是 /{site\.layout\.(.)+}/ + 而不是 * else {site.layout.} 可能会破坏你的日常生活

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


【解决方案1】:

您可以使用preg_replace 一次性查找和替换您的标签。

在我看来,最好的方法是使用现有的模板系统,例如 Twig 或 Smarty。我确信您可以将数据读入 Smarty(不必来自文件)。我敢肯定 Twig 也有类似的东西。

Twig 和 Smarty 还提供缓存选项,因此您不会在每次请求时都重新构建模板。但是,如果模板存储在文件中,它们的效果最好。

如果你真的必须使用你自己的模板系统,你应该构建某种解析器来逐个字符地检查内容。这可能会比正则表达式更快、更准确(尽管更复杂)

【讨论】:

  • 最后一段不必为真;在某些情况下,PCRE 正则表达式可能比 PHP 内部函数快得多,PHP 内部函数可用于遍历字符串。这是因为 PCRE 引擎已经优化(用于解析)多年,而 PHP 有另一层代码会减慢它的速度。
  • +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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-19
    • 2015-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多