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

2024-03-30

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

不幸的是,就我对 PHP 和脚本的了解而言,我不太确定从哪里开始。我的第一反应是通过某种正则表达式解析器运行整个文档,并将我的自定义标记映射到特定的 PHP 函数……但这对我来说似乎有点慢且笨拙。

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


Update

好的,让我进一步完善我的解释......我为 WordPress 开发网站。我的很多客户都想定制他们的网站,但每当我开始谈论 PHP 时他们就跑开了。它是一种看起来太复杂的脚本语言,对于外行用户来说根本就没有兴趣。

我想做的是专门为 WordPress 创建我自己的标记形式。因此,不要进行 PHP 函数调用(get_header() and get_footer() and if(has_posts())...) 在主题文件中,您将拥有命名空间 XML (<wpml:header /> and <wpml:footer /> and <wpml:loop> ... </wpml:loop>)这翻译成同样的事情。它将更好地将模板文件与服务器端脚本分开(有几个主题将整个 PHP 函数直接放在主题的 PHP 模板文件中!!!),并且将使非开发人员更容易开始工作自定义 WordPress 主题。

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

那么……在构建新的服务器端标记处理器时我应该从哪里开始呢?


听起来您需要的是一种支持通过自定义令牌扩展的模板语言。鉴于 PHP 本身就满足了这一需求,我猜您还需要某种沙箱。

为此,我建议TWIG http://www.twig-project.org/.

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

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

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

无论你做什么,在发明你自己的模板语言之前都要仔细思考。从长远来看,这通常是一个巨大的痛苦,并且往往会出现在《每日 WTF》上BobX http://thedailywtf.com/Articles/We-Use-BobX.aspx迟早。

Update:我的印象是您热衷于在模板中使用命名空间 XML。是否真的值得重新发明整个模板引擎以便您的用户可以使用<wpml:header />而不是{{header}}? TWIG 不允许用户嵌入任意脚本...只是您已明确确定的变量和流程控制结构。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编写新的脚本“语言”时从哪里开始? 的相关文章

随机推荐

  • 在 C# 4.0 中,为什么方法中的输出参数不能是协变的?

    鉴于这个神奇的界面 public interface IHat
  • 特定嵌套属性的 MongoDB 投影

    data visits daily 2018 09 05 3586 2018 09 06 2969 2018 09 07 2624 2018 09 08 2803 2018 09 09 3439 2018 09 10 3655 我在 Mon
  • 对主干集合进行排序

    所需的功能 我正在使用 Backbone Collection 来查看可排序列表中的数据 我已经得到了单击某些 dom 元素会在我的 Collection 上设置属性的部分 以确定我想要排序的字段以及应该进行哪个方向的排序 然后应该在集合上
  • 从构建秘密设置 docker env var

    使用新的Docker时有没有办法设置环境变量构建增强功能 https docs docker com develop develop images build enhancements 试过 RUN mount type secret id
  • 无法使用 flutter 在 iOS 14 上运行 ios 应用程序 [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我刚刚安装了 iOS 14 beta 并将 Xcode 更新到最新版本 12 beta 3 我收到类似的错误 Unabl
  • 从字符串中的链接获取网站标题

    字符串 这是徽章 https stackoverflow com badges https stackoverflow com badges布拉布拉布拉 如果字符串包含一个链接 见上文 我想解析该链接的网站标题 它应该返回 徽章 堆栈内存溢
  • 在xamarin中使用共享首选项[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我尝试在应用程序关闭并重新打开后保存字符串值 我查看了所有 SharedPreferences 但我不明白是否需要打开新
  • 强制转换是可重写的操作吗?如果是这样,怎么办?

    是否可以在 C 中覆盖 C 风格 强制转换 假设我有代码 double x 42 int k int x 我可以让第二行中的强制转换执行我编写的一些代码吗 就像是 I don t know C I have no idea if this
  • 如何覆盖 Primefaces 默认 CSS?

    我正在尝试覆盖素面主题我的css看起来像这样文件1 xhtml ui menubar font family Verdana Arial Helvetica sans serif font size 11px important backg
  • 如果一个成员是 IDisposable,我们是否应该实现 IDisposable?

    我想是这样 但看一下 ASP NET 中的一个内置类 public sealed class HttpPostedFile public Stream InputStream get Stream implements IDisposabl
  • 如何防止 ASP.NET 和 Kentico 处理静态文件

    我有一个 Kentico CMS 网站 正在处理静态资源 例如 png 文件 我希望 ASP NET 不处理这些文件 我该怎么做呢 我正在使用 Kentico CMS Web 表单 运行 IIS 7 5 和 ASP NET 3 5 应用程序
  • Android XML 解析器跳过标签

    我正在制作一个可以阅读 RSS 源的阅读器 起初我想使用一个库 但意识到他们无法加载一些数据 所以我决定制作自己的阅读器 但这是问题所在 我的解析器并不总是返回图像 具体取决于此 RSS 等站点图片位于内容 数据中 http www znb
  • Typescript 键盘事件:“Event”类型的参数不可分配给“KeyboardEvent”类型的参数

    即使代码完美运行 我也会出现以下错误 TS2345 Argument of type Event is not assignable to parameter of type KeyboardEvent Property altKey is
  • 无法在cmake中使用find_package找到Lua标头

    我正在尝试使用 CMake 为我使用 Lua 的项目构建生成 make 文件 当我运行 make 时出现此错误 path to my project luaudio luaudio c 1 17 fatal error lua h No s
  • nifi 中的 JSON 数组到多个 JSON 对象

    我想在 Nifi 中实现以下请求响应场景 我的目标是在更多不同的处理器中使用每个值作为数组 对象键 1 对象键 2 因此 如果我可以将其转换为多个 JSON 那么使用拆分 JSON 我可以稍后使用多个值 请为此提出各种解决方案 输入 JSO
  • SQL 存储过程 LIKE

    这是一个简单的问题 我似乎想不出解决方案 我在我的存储过程中定义了这个 communityDesc varchar 255 NULL communityDesc 是 aaa bbb ccc 在我的实际查询中我尝试使用IN WHERE ARE
  • 返回一个空数组

    我试图想出返回空数组的最佳方法 而不是null 有什么区别吗foo and bar private static File foo return Collections emptyList toArray new File 0 privat
  • C++ 中‘operator’的不明确重载

    我在这里阅读了几篇关于此类错误的文章 但我无法解决这个问题 很快我定义了运算符 int 和函数 f 无法编译 我测试了几件事 但无法解决问题 谢谢 ex1 cpp In function int main int char ex1 cpp
  • 在react js中调用axios get请求时出现网络错误

    我在 macOS 中使用 React js 当我尝试调用时axios get 我收到网络错误 我读过许多像我一样使用 React Native 的其他案例 答案是添加设置以允许他们使用http在 Mac 中而不是https 但是该设置不能在
  • 编写新的脚本“语言”时从哪里开始?

    我需要编写一个在 PHP 下运行的基本脚本 模板引擎 理想情况下 我能够将我自己的标记语言与 X HTML 模板混合 并通过服务器端解析器运行文档 以动态地用数据库提供的 X HTML 替换我自己的标记 不幸的是 就我对 PHP 和脚本的了