在编写新的脚本“语言”时,我从哪里开始?

时间:2010-09-16 04:38:37

标签: php xml templates scripting markup

我需要编写一个可以在PHP下运行的基本脚本/模板引擎。理想情况下,我可以将自己的标记语言与(X)HTML模板混合,并通过服务器端解析器运行文档,以使用数据库提供的(X)HTML动态替换我自己的标记。

不幸的是,由于我对PHP和脚本的所有了解,我不太清楚从哪里开始。我的第一直觉是通过某种正则表达式解析器运行整个文档,并将我的自定义标记映射到特定的PHP函数......但这对我来说似乎有点慢而且很苛刻。

哪些资源/教程/示例可以指向正确的方向?为了比较,我真的很喜欢用于.NET MVC的新Razor模板引擎...我不想完全把它当作一个PHP项目,但是构建类似的东西会很棒。


更新

好的,让我更多地解释一下我的解释......我为WordPress开发网站。我的很多客户都希望自定义他们的网站,但每当我开始谈论PHP时就会逃跑。这是一种脚本语言,对于外行用户来说看起来太复杂了,甚至不想引起兴趣。

我想要做的是专门为WordPress创建我自己的标记形式。因此,不是在主题文件中调用PHP函数(get_header()get_footer()以及if(has_posts()) ...),而是使用命名空间XML(<wpml:header />和{{1转换为相同的东西。}和<wpml:footer />)。它可以更好地将模板文件与服务器端脚本分开(有几个主题将整个PHP函数直接放在主题的PHP模板文件中!!!)并且可以使非开发人员更容易开始工作自定义WordPress主题。

考虑到这一点,已经建议的TWIG和Mackrell解决方案肯定支持在文件中嵌入脚本“nuggets”的想法,但它们并没有真正帮助我将自定义XML / XHTML标记解析为可识别的东西。服务器端代码。

那么......在构建新的服务器端标记处理器时,我从哪里开始?

4 个答案:

答案 0 :(得分:5)

听起来你需要的是一种模板语言,支持通过自定义标记进行扩展。鉴于PHP本身满足了这种需求,我猜你也想要某种沙盒。

为此,我建议TWIG

默认情况下,它使用与Django和Jinja2 for Python或Liquid for Ruby相同的基本语法(虽然不推荐,但是可配置),并且为了速度而编译为缓存的PHP。

它支持沙盒和参数自动转义以及块替换和继承,您可以选择它可以访问的变量,并且您可以设置任何您想要的默认和自定义标记和过滤器的组合。

Smarty也可能满足您的需求,但我不确定它是否具有上述所有功能,在我看来,它的语法并不优雅,而且我被告知它比它的更痛苦值得。

无论你做什么,在发明自己的模板语言之前,要仔细思考。从长远来看,这通常是一个巨大的痛苦,并且迟早会在BobX旁边的每日WTF结束。

更新:我得到的印象是您对使用命名空间XML进行模板操作非常着迷。是否真的值得重新发明整个模板引擎,以便用户可以使用<wpml:header />而不是{{header}}? TWIG不允许用户嵌入任意脚本......只是你已明确确定的变量和流量控制结构。

答案 1 :(得分:4)

另一个选项是将您的模板解析为xml文档并将其转换为另一个xml文档,并将自定义标记替换为其他标记(例如<?php处理说明)。在这种情况下,您需要XSL

答案 2 :(得分:1)

对于自定义XML,您可以使用PHP XML parser,最好使用SAX进行演出。

Smarty 是一个非常好的PHP模板引擎,内置标签,块和功能。您可以扩展它们以创建自己的,甚至删除内置的(对于Smarty 3)。

如果您需要创建自己的脚本,我建议您检查语言解析器,例如 Lex Yacc 。您必须以those SQLite images之类的方式定义语言,而不是以图形方式而是以文本方式。还有其他grammatical language parser可用。我给的那些是最古老和最着名的,但它是为C ++完成的。

您可能希望避免自己这样做(例如使用RegExp)。很快,您的脚本中就会出现许多不一致之处。尽管RegExp本身就是一种由自动化程序解释的语言。

您可以将两者混合使用:XML解析器和常规解析器。查看Finite-state machine (FSM)

答案 3 :(得分:-1)

我从XML开始,定义典型的页面标记的样子,然后继续以您选择的语言解密XML,然后采用它并创建HTML。

xml应该是一堆描述您特定语言的节点。

因此...

<MyPage>
  <MyElement id="myid" type="MyType1">
    <MyElement id="myid" type="MyType1" Text="Some text"/>
  </MyElement>
  etc...

我会更加仔细地在互联网上查看是否已经重新构建了一些适合您需求的东西,然后再开始这样的事情,这种事情很有可能成为其中一个产生的东西之一控制并且无法维持。