PHP嵌套模板解析器

PHP嵌套模板解析器,php,parsing,templates,template-engine,Php,Parsing,Templates,Template Engine,我需要一个能够解析以下格式的PHP模板解析器: {users} {name} {age} {posts} {title} {body} {comments} {comtitle} {combody} {/comments} {/posts} {/users} 我研究过的所有模板分析器。。。要么是不够递归,要么是带有不必要的模板结构,这些模板结构看起来非

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

{users}
    {name}
    {age}
    {posts}
        {title}
        {body}
        {comments}
            {comtitle}
            {combody}
        {/comments}
    {/posts}
{/users}
我研究过的所有模板分析器。。。要么是不够递归,要么是带有不必要的模板结构,这些模板结构看起来非常类似于PHP语法,不值得这样做。这是CodeIgniter模板的默认工作方式,但它们的挖掘深度不够

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

你知道解析器是否存在吗? 或者您是否创建了一个读取这种类型结构的文件? 所需的解析器应该能够无限深入地挖掘,前提是为其提供了更嵌套的数组

具体地说,我正在寻找CodeIgniter解决方案,但任何PHP解决方案在这一点上都已经足够了,因为我已经对此进行了几天的研究


谢谢

如前所述,该格式看起来无法解析。无法区分具有匹配的
{/tag}
(如
{posts}
)和不具有匹配的
{body}
)的
{tag}


不要试图重新发明轮子。除了PHP本身,还有很多优秀的模板解析器。除非你真的很好,否则你所提出的任何东西都可能不会像已经存在的那样功能强大,速度也不会那么快。

我决定完全放弃第三方模板解析器,选择使用PHP的本机支持。在我自己的规范中,与兼容性、深层嵌套、条件、循环相关的头痛是不值得的

从这一点开始,我将简要地教授我的设计器复杂视图的循环和条件。对于任何使用CodeIgniter的人,我强烈建议启用短标记并利用以下功能回传数据:

而不是:

你可以这样写:

看看这与标准模板语言有多接近:
{variable}

开始使用PHP,这样您的代码就不会被
echo
语句和HTML的长PHP字符串所充斥

在我看来,这就是模板化解决方案。尽管你的设计师会因为你的介绍而讨厌你:

if
elseif
endif
foreach
endforeach
,与他们进行一个小时的讨论,解释他们如何使用示例,将使您的观点具有最大的灵活性

发疯

“我没有测试来证明这一点,但我认为这对电脑来说是个笑话。”@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:}
模式时,您将知道有一个匹配的标记,而不必为所有模式查找一个。然后,您可以轻松地使用
preg\u match()
来通过


(注意:您仍然可以对您的样式执行相同的操作,尽管您必须向后解析代码,这可能会给您带来不便。)

horrah,他们用不同的标记分隔符重新创建了XML!我想说的是,使用XSLT,甚至可能会在将来的工作中派上用场。重新发明轮子正是我不想做的——这就是为什么我要问这个问题。你能解释一下“没有办法区分{tag}…?”我以前没有写过解析器,但是区分{tag}{/tag}和单个{tag}似乎很简单。。。首先读入整个模板,如果它有一个匹配的{/tag},则意味着在相应数组的所有元素上循环,否则,除了{tag}是单个元素之外,不是吗?像这样在解析器中向前看是非常低效的。你完全正确。不知怎的,我重新回到了这个问题上——两年前我还非常天真/缺乏经验。这是一个很好的建议。干杯