我需要一个能够解析以下格式的PHP模板解析器:
{users}
{name}
{age}
{posts}
{title}
{body}
{comments}
{comtitle}
{combody}
{/comments}
{/posts}
{/users}
我所研究过的所有模板解析器都不具有递归性,或者带有不必要的模板结构,这些结构与PHP语法非常相似,不值得。这是CodeIgniter模板工作的默认方式,但它们不能深入挖掘。
信不信由你,this blog post中解析器的 none 似乎能够做到这一点。有些人可以实现它,但使用的语法接近PHP的原生foreach函数。
你知道解析器是否存在吗? 或者您创建了一个读取此类结构的? 如果为它提供了更加嵌套的数组,那么理想的解析器应该能够进一步向下挖掘。
具体来说,我正在寻找一个CodeIgniter解决方案,但是现在任何PHP解决方案都足够了,因为我已经调查了几天了。
谢谢!
答案 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这是 模板解决方案。虽然你的设计师会讨厌你介绍:
if
,elseif
,endif
,foreach
和endforeach
,与他们进行一小时的讨论,解释他们如何使用示例将最有助于您您的观点具有灵活性。
坚果!
答案 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()
来完成任务。
(注意:你仍然可以对你的风格做同样的事情,虽然你必须向后解析代码,这会让我觉得非常不方便。)