模板ifs使用正则表达式

时间:2008-12-23 20:39:59

标签: php regex

嘿大家,我正在开发一个PHP应用程序,需要解析一个带有HTML的.tpl文件,我正在制作它,以便HTML可以有变量和基本的if语句。 if语句看起来像这样: `

<!--if({VERSION} == 2)-->
Hello World
<!--endif -->

为了解析这个问题,我尝试使用preg_replace但没有运气。我试过的模式是

/<!--if\(([^\]*)\)-->([^<]*)<!--endif-->/e

替换为

if($1) { echo "$2"; }

关于为什么这不起作用的任何想法以及我可以做些什么来启动和运行?

3 个答案:

答案 0 :(得分:3)

endif-->之间有空格,但正则表达式不允许这样做。

顺便说一句,这看起来非常不安全......你有没有理由不使用像Smarty这样的预制模板引擎?

答案 1 :(得分:2)

测试你的正则表达式,我看到你的反斜杠应用于方括号。要在带引号的字符串中使用方括号内的反斜杠,您需要将其转义两次:

'/<!--if\(([^\\\]*)\)-->([^<]*)<!--endif-->/e'

但我不知道你为什么要发明一个新的模板逻辑框架,当Smarty和PHP本身就存在这样的解决方案时。


这是测试代码,以回应下面的评论。

<强> testinput.tpl

<!--if({VERSION} == 2)-->
Hello World
<!--endif-->

<强> match.php

<?php
$template = file_get_contents('testinput.tpl');
print preg_match('/<!--if\(([^\\\]*)\)-->/e', $template) . "\n";
print preg_match('/<!--endif-->/e', $template) . "\n";
print preg_match('/<!--if\(([^\\\]*)\)-->([^<]*)<!--endif-->/e', $template) . "\n";

试运行

$ php match.php
1
1
1

答案 2 :(得分:0)

我认为你打算这样做:

'/<!--if\(([^)]*)\)-->([^<]*)<!--endif-->/'

你的正则表达式中只有一个字符类:

[^\]*)\)-->([^<]

以下是发生的事情:

  • 第一个结束的方括号被反斜杠转义,因此字面上匹配。
  • 假设关闭第一个捕获组并打开第二个捕获组的括号也是字面意思;没有必要逃避角色类中的parens。
  • 第一个连字符 被视为元字符;它形成范围[)* +, - ]
  • 第二个开口方括号被视为文字方括号,因为它位于字符类中。
  • 第二个插入符号作为字面插入符号,因为它不是该类中的第一个字符。

因此,在删除重复项并将字符排序为ASCII顺序后,您的字符类等同于:

[^()*+,\-<>\[\]^]

字符类之外的括号仍然是平衡的,所以正则表达式编译,但它甚至没有达到你想要它的匹配。