Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 编写新脚本时从何处开始;语言;?_Php_Xml_Templates_Scripting_Markup - Fatal编程技术网

Php 编写新脚本时从何处开始;语言;?

Php 编写新脚本时从何处开始;语言;?,php,xml,templates,scripting,markup,Php,Xml,Templates,Scripting,Markup,我需要编写一个在PHP下运行的基本脚本/模板引擎。理想情况下,我将能够将自己的标记语言与(X)HTML模板混合,并通过服务器端解析器运行文档,以动态地将自己的标记替换为从数据库提供的(X)HTML 不幸的是,尽管我对PHP和脚本都很了解,但我不太确定从哪里开始。我的第一反应是通过某种正则表达式解析器运行整个文档,并将自定义标记映射到特定的PHP函数。。。但对我来说,这似乎有点缓慢和沉重 有哪些资源/教程/示例可以为我指明正确的方向?作为比较,我真的很喜欢.NETMVC的新Razor模板引擎。。。

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

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

有哪些资源/教程/示例可以为我指明正确的方向?作为比较,我真的很喜欢.NETMVC的新Razor模板引擎。。。我不想完全停止PHP项目,但是构建类似的东西会很好


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

我想做的是专门为WordPress创建我自己的标记形式。因此,与主题文件中的PHP函数调用(
get_header()
get_footer()
if(has_posts())
)不同,您可以使用名称空间的XML(
..
)来转换为相同的内容。它可以更好地将模板文件与服务器端脚本分离(有几个主题将整个PHP函数直接放在主题的PHP模板文件中!!!),并使非开发人员更容易开始定制WordPress主题

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


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

我将从XML开始,定义典型的页面标记的外观,然后继续用您选择的语言破译XML,然后使用该语言创建HTML

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

所以


我会更仔细地在互联网上寻找,看看是否已经有一些重新构建的东西适合你的需要,然后再开始像这样的事情,它有非常真实的潜力成为那些失控和无法维护的事情之一。

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

为此,我建议

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

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

也可能满足您的需要,但我不确定它是否具有上述所有功能,在我看来,它的语法没有那么优雅,而且我被告知它的痛苦比它的价值更大

无论你做什么,在发明你自己的模板语言之前,要仔细考虑很久。从长远来看,这通常是一个巨大的痛苦,而且往往最终会出现在WTF的日常节目中


更新:我觉得您沉迷于使用名称空间的XML作为模板。重新设计一个完整的模板引擎,让您的用户可以使用
而不是
{{header}
,真的值得吗?TWIG不允许用户嵌入任意脚本。。。只需明确定义变量和流控制结构。

另一个选项是将模板解析为xml文档,并将其转换为另一个xml文档,将自定义标记替换为其他标记(例如,
对于自定义xml,最好使用SAX来执行

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

如果你需要创建自己的脚本,我建议你检查语言分析器,比如<强> LeX 和<强> yACC 。你必须用一种不象图形的方式定义你的语言,但是文本是有其他的。我所给出的是最古老和最有名的,但是它是C++的。

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


你可以混合使用这两种:XML解析器和通用解析器。看看。

每当用XML编写新的DSL时,就会有一只小猫被杀死……但PHP是一个“基本的脚本/模板引擎”。为什么要重新发明轮子?只需使用正则表达式从源代码中去除不允许的构造并对其进行eval()。Twig不会“嵌入脚本块”,这正是你想要的:一种模板语言。如果你不想使用香草PHP,如果以前已经使用过,就不要麻烦编写自己的。我用过它,而且用它编写自己的语法非常容易。鲍勃,是你吗?@user257493这有点极端。我正在尝试为你开发一些东西不是PHP开发人员的人。任何了解PHP的人都可以使用PHP。
<MyPage>
  <MyElement id="myid" type="MyType1">
    <MyElement id="myid" type="MyType1" Text="Some text"/>
  </MyElement>
  etc...