2011-07-21 51 views
0

我需要一个PHP模板解析器能够解析以下格式:PHP嵌套模板解析器

{users} 
    {name} 
    {age} 
    {posts} 
     {title} 
     {body} 
     {comments} 
      {comtitle} 
      {combody} 
     {/comments} 
    {/posts} 
{/users} 

所有模板解析器我看着......要么不够递归或配备不必要的模板与PHP语法看起来非常相似的构造,这是不值得的。这是CodeIgniter模板的默认工作方式,但它们不够深入。

信不信由你,没有this blog post中的解析器似乎能够做到这一点。有些人可以实现它,但是有一个接近PHP本地foreach函数的语法。

你知道解析器是否存在吗? 还是你创建了一个读取这种类型的结构? 只要给它提供了更多的嵌套数组,它所需的解析器应该能够无限进一步挖掘。

具体来说,我在寻找一个CodeIgniter解决方案,但是现在任何PHP解决方案都已经足够了,因为我已经调查了几天了。

谢谢!

+0

华友世纪,他们改造XML与不同标签的分隔符!我会说XSLT,甚至可能会派上用场了解它的未来工作。 – Wrikken

回答

0

我决定完全放弃第三方模板解析器,并选择使用PHP的本机支持。与兼容性,深嵌套,条件,循环相关的头痛,都在我自己的规范中,不值得。从现在开始,我将简要介绍我的设计器循环和条件语句,以便处理复杂的视图。对于使用CodeIgniter的人,我强烈建议启用短标记和呼应了数据获取的CodeIgniter's Optional Syntax优势:

相反的:<?php echo $variable; ?>

一个可以这样写:<?=$variable?>

看看如何接近这个接近标准模板语言:{variable}

开始使用PHP的Alternative Syntax For Control Structures,以便您的代码不会被echo语句和长的PHP PHP字符串散布。

IMO这是模板解决方案。虽然你的设计师会恨你介绍:

ifelseifendifforeachendforeach,跟他们解释,他们用的例子会给你在你的观点了最大的灵活性是如何工作的一个小时的讨论。

疯了!

1

正如所写,该格式看起来不可能解析。无法区分将匹配{/tag}(如{posts})的{tag}和不会(如{body})的匹配。

不要试图重新发明轮子。有很多很好的模板解析器,以及PHP本身。除非你真的很好,否则你提出的任何东西可能都不会像已经存在的东西那么有效,也不会那么快。

+0

重塑车轮正是我不想做的 - 这就是为什么我问这个问题。你能解释“没有办法区分{tag} ...吗?”吗?我以前没有写过解析器,但将{tag} {/ tag}与单个{tag}区分开来似乎很平凡......您首先阅读整个模板,如果它具有匹配的{/ tag},则意味着循环遍历相应数组的所有元素,否则,期望{tag}是单个元素,否? –

+0

不得不在解析器中展望这样的效率会非常低下。 – duskwuff

+0

你是完全正确的。不知怎的,我重新登陆这个问题 - 两年前我非常天真/缺乏经验。这是一直以来的伟大建议。干杯! –

0

“我没有测试来支持这个,但我会认为这是一个计算机的笑话。” @Jordan Arseno

约旦,我同意。虽然如果你有很多文件需要同时解析,它可能会加起来非常糟糕。我同意你有自己的模板解析器,如果你有驱动器/特殊需求的话。虽然使用一点点不同的语法可以为您节省大量的处理时间在分析过程中...

而不是使用这个版本:

{users} 
    {name} 
    {age} 
    {posts} 
     {title} 
     {body} 
     {comments} 
      {comtitle} 
      {combody} 
     {/comments} 
    {/posts} 
{/users} 

你也可以同样使用类似:

{foreach: users} 
    {name} 
    {age} 
    {foreach: posts} 
     {title} 
     {body} 
     {foreach: comments} 
      {comtitle} 
      {combody} 
     {endforeach: comments} 
    {endforeach: posts} 
{endforeach: users} 

通过这种方式,当找到{foreach:<array>}模式时,您会知道有一个匹配标签,您不必尝试为所有模式找到一个标签。然后您就可以轻松使用preg_match()来完成任务。

(注:你仍然可以做你的风格一样,虽然你将不得不向后分析代码,这将使它确实不方便我猜)