代码之家  ›  专栏  ›  技术社区  ›  EAMann

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

  •  4
  • EAMann  · 技术社区  · 15 年前

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

    不幸的是,就我所知的PHP和脚本编写而言,我不太确定从哪里开始。我的第一反应是通过某种regex解析器运行整个文档,并将自定义标记映射到特定的PHP函数…但对我来说,这似乎有点缓慢和沉重。

    有哪些资源/教程/示例可以为我指明正确的方向?相比之下,我真的很喜欢.NET MVC的新Razor模板引擎…我不想为一个PHP项目完全取消它,但是构建类似的东西是很好的。


    更新

    好吧,让我再详细解释一下……我为WordPress开发网站。我的很多客户都想定制他们的网站,但每当我开始谈论PHP时,他们都会跑掉。这是一种脚本语言,对于非专业用户来说,它看起来太复杂了,甚至不想引起他们的兴趣。

    我要做的是专门为WordPress创建自己的标记形式。所以不要调用php函数( get_header() get_footer() if(has_posts()) …)在主题文件中,您应该有名称空间XML( <wpml:header /> <wpml:footer /> <wpml:loop> ... </wpml:loop> )这意味着同样的事情。将模板文件与服务器端脚本分开会做得更好(有几个主题将整个PHP函数直接放在主题的PHP模板文件中!)!!!)这将使非开发人员更容易开始自定义WordPress主题。

    考虑到这一点,twig和mackrell已经提出的解决方案肯定支持在文件中嵌入脚本“nuggets”的想法,但它们并不能真正帮助我将自定义XML/XHTML标记解析为服务器端代码可识别的内容。

    所以…构建新的服务器端标记处理器时,从何处开始?

    4 回复  |  直到 15 年前
        1
  •  4
  •   Casper    14 年前

    另一种选择是将模板解析为XML文档并将其转换为另一个XML文档,用其他标记(例如 <?php 处理指令)。在这种情况下, XSL 就是你要找的。

        2
  •  5
  •   ssokolow    15 年前

    听起来您需要的是一种模板化语言,它支持由自定义令牌进行扩展。考虑到PHP本身满足了这一需求,我猜想您还需要某种类型的沙盒。

    为此,我建议 TWIG .

    默认情况下,它使用与Django和Jinja2(用于Python)相同的基本语法或Liquid(用于Ruby)相同的基本语法(尽管不建议使用可配置的基本语法),并编译为缓存的PHP以提高速度。

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

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

    无论你做什么,在发明你自己的模板语言之前,要想很久和努力。从长远来看,这通常是一个巨大的痛苦,而且往往最终会出现在每日WTF的旁边 BobX 迟早。

    更新: 我有种感觉,您对使用名称空间XML进行模板化非常着迷。是否真的值得重新设计一个完整的模板引擎,以便用户使用 <wpml:header /> 而不是 {{header}} ?Twig不允许用户嵌入任意脚本…只是变量和流控制构造。

        3
  •  1
  •   Wernight    15 年前

    对于自定义XML,可以使用 PHP XML parser 最好是萨克斯的表演。

    聪明的 是一个非常好的具有内置标记、块和函数的PHP模板引擎。您可以扩展它们来创建自己的,甚至删除内置的(对于Smarty3)。

    如果您需要创建自己的脚本,我建议您检查 语言分析器 喜欢 莱克斯 YACC . 你必须像这样定义你的语言 those SQLite images 只是不是以图形的方式,而是以文本的方式。还有其他的 grammatical language parser 可用。我给的是最古老和最有名的,但它是C++完成的。

    您可能希望自己避免这样做(比如使用regexp)。很快,脚本中就会出现许多不一致的地方。尽管regexp本身就是一种自动解释的语言。

    您可以混合使用这两种语言:XML解析器和常规解析器。退房 Finite-state machine (FSM) .

        4
  •  -1
  •   griegs    15 年前

    我首先在XML中定义一个典型的页面标记是什么样子的,然后继续用您选择的语言破译XML,然后使用它并创建HTML。

    XML应该是一组描述特定语言的节点。

    所以…

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

    我会更仔细地在互联网上寻找,看看是否已经有一些重建的东西能够满足你的需要,然后再着手这样的事情,它有非常真正的潜力成为那些失控和无法维护的事情之一。