PHP嵌套模板解析器

时间:2011-07-21 23:05:29

标签: php parsing templates template-engine

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

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

我所研究过的所有模板解析器都不具有递归性,或者带有不必要的模板结构,这些结构与PHP语法非常相似,不值得。这是CodeIgniter模板工作的默认方式,但它们不能深入挖掘。

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

你知道解析器是否存在吗? 或者您创建了一个读取此类结构的? 如果为它提供了更加嵌套的数组,那么理想的解析器应该能够进一步向下挖掘。

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

谢谢!

3 个答案:

答案 0 :(得分:1)

如上所述,该格式似乎无法解析。无法区分具有匹配{tag}{/tag})的{posts}和不匹配{body}的{​​{1}}。

不要试图重新发明轮子。有很多好的模板解析器,还有PHP本身。除非你真的好,否则你提出的任何事情都可能不会像现有的那样具有特色,也不会那么快。

答案 1 :(得分:0)

我决定完全放弃第三方模板解析器并选择使用PHP的原生支持。与兼容性,深度嵌套,条件,循环相关的头痛都在我自己的规范范围内,这是不值得的。

从这一点开始,我将简要地教我的设计师循环和条件复杂的视图。对于任何使用CodeIgniter的人,我强烈建议启用短标签并利用CodeIgniter's Optional Syntax来回显数据:

而不是:<?php echo $variable; ?>

可写:<?=$variable?>

了解这与标准模板语言的接近程度:{variable}

开始使用PHP的Alternative Syntax For Control Structures,这样你的代码就不会充斥着echo语句和长PHP的HTML字符串。

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

ifelseifendifforeachendforeach,与他们进行一小时的讨论,解释他们如何使用示例将最有助于您您的观点具有灵活性。

坚果!

答案 2 :(得分: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()来完成任务。

(注意:你仍然可以对你的风格做同样的事情,虽然你必须向后解析代码,这会让我觉得非常不方便。)