嘿大家,我正在开发一个PHP应用程序,需要解析一个带有HTML的.tpl文件,我正在制作它,以便HTML可以有变量和基本的if语句。 if语句看起来像这样: `
<!--if({VERSION} == 2)-->
Hello World
<!--endif -->
为了解析这个问题,我尝试使用preg_replace
但没有运气。我试过的模式是
/<!--if\(([^\]*)\)-->([^<]*)<!--endif-->/e
替换为
if($1) { echo "$2"; }
关于为什么这不起作用的任何想法以及我可以做些什么来启动和运行?
答案 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-->/'
你的正则表达式中只有一个字符类:
[^\]*)\)-->([^<]
以下是发生的事情:
因此,在删除重复项并将字符排序为ASCII顺序后,您的字符类等同于:
[^()*+,\-<>\[\]^]
字符类之外的括号仍然是平衡的,所以正则表达式编译,但它甚至没有达到你想要它的匹配。