【发布时间】: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