2012-02-29 70 views
2

我在一个MySQL数据库中存储HTML布局。这些布局可以在HTML,如下所示内包含标签..PHP标记替换方法

{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); 
    } 
    } 

我需要执行一个正则表达式为电子ach标签我需要,然后对该标签的每个实例执行str_replace ..同样需要为每个需要的部分模板做.. 对我来说,这是所有似乎变得沉重..

是否有一个更好的方式来做到这一点?

在此先感谢..

编辑:我不希望使用现有的库,我想这样做的任务和自己在这个过程中学习..

+0

是您使用preg_match_all收集模板中所有标签的唯一原因?通常你的代码会有一个需要进入模板的标签列表。将数组的数组/对象推入模板不是更有效吗?然后str_replace你有什么。如果你担心遗留标签,那么最后再扫一扫以清空它们。 – Bradmage 2012-03-11 16:45:31

+0

mmm ..只要看看你的$ tmp_partial行。看起来你的框架倒退了。您是否通过模板中的标签加载所需的HTML /数据片段?我首先收集所有的数据,然后遍历数组str_replace-ing每个标记,因为逻辑是用模板构建的,不应该有任何杂散标记(我使用基本的IE:array('head'=>' ','body'=>''),所以从一开始就覆盖了一切。 – Bradmage 2012-03-11 16:49:22

+0

非常多,我打算将HTML一起带出数据库,然后通过替换所有标记实例来循环。 – Lee 2012-03-12 08:40:07

回答

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); 
5

那么你可以使用preg_replace来一次性找到并替换您的标签。

我认为最好的方法是使用现有的模板系统,如Twig或Smarty。我确信你可以将数据读入Smarty(它不一定来自文件)。我相信Twig有类似的东西。

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

如果你真的必须推出你自己的模板系统,你应该建立一种解析器,它实际上会逐个检查内容。这可能会比正则表达式更快,更准确(虽然更复杂)

+0

最后一段不一定是真的;在某些情况下,PCRE正则表达式可能比可用于循环字符串的PHP内部函数快得多。这是因为多年来PCRE引擎已经被优化(用于解析),并且PHP还有另一层代码使其慢下来。 – sg3s 2012-03-12 11:44:04

+1

+1用于推荐现有的模板系统。除非使上述工作本身成为目标(即学习体验),否则不需要重新发明自行车。 – 2012-03-13 07:01:09