2008-12-23 59 views
0

嘿大家好,我正在研究一個PHP應用程序,它需要解析HTML中的一個.tpl文件,並且使得HTML可以包含變量和基本if語句。 if語句是這個樣子: `模板如果使用正則表達式

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

要分析,我使用preg_replace沒有運氣已經試過。我嘗試的模式是

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

而它與

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

任何想法代替,爲什麼這不會工作,我能做些什麼來得到它運行起來?

回答

0

我THI NK你的意思是這樣:

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

你的正則表達式中有隻有一個字符類:

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

這裏的發生的事情:

  • 第一關閉方括號被轉義反斜槓,所以它從字面上匹配。
  • 假設接近第一個捕獲組並開啓第二個捕獲組的圓括號也是字面意義上的;沒有必要在角色類別內部逃跑。
  • 第一個連字符作爲元字符;它形成了範圍[] * +, - ]
  • 第二個開放方括號被視爲文字方括號,因爲它在一個字符類中。
  • 第二個脫字號被當作文字插入符號,因爲它不是班級中的第一個字符。

所以,刪除重複項和人物整理成自己的ASCII順序,之後你的角色類是相同的:

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

和字符類外的括號仍然平衡,所以正則表達式編譯,但它甚至沒有接近你想要的結果。

3

你有一個endif-->之間的空間,但你的正則表達式不允許這樣做。

順便說一下,這似乎可怕的不安全......是否有任何理由你沒有使用像Smarty這樣的預建模板引擎?

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 
+0

我正要問完全相同的問題...所以我只是upvote你! ;-) – PhiLho 2008-12-23 20:55:07