2012-06-01 60 views
-2

我想在PHP中創建一個簡單的框架,它將包含一個文件(index.bel)並在文件中呈現變量。例如,index.bel可能包含以下內容:是否可以在不使用eval的情況下呈現文件的內容?

<h1>{$variable_name}</h1> 

我將如何做到這一點,而不使用eval或苛刻框架的用戶喜歡這類型index.bel:

$index = "<h1>{$variable_name}</h1>"; 

在換言之:是否可以在不使用eval的情況下呈現文件的內容?我的問題的工作方案是這樣的:

的index.php:

<?php 
$variable_name = 'Welcome!'; 
eval ('print "'.file_get_contents ("index.bel").'";'); 

index.bel:

<h1>{$variable_name}</h1> 
+0

這有什麼錯一些正則表達式來查找和'str_replace' ... –

+0

的模板引擎類將是更好的包括。 SMARTY例如(我覺得SMARTY未來通過仇恨)至少一個模板引擎支持自己的框架;它恭維它。 – TheBlackBenzKid

+1

使用模板引擎。 – Sarfraz

回答

0

是的,這是可能的,但爲什麼你讓自己的框架?你提供的代碼看起來很像Smarty模板。你可以試着看看他們是如何做到的。

運行這些代碼的一種可能的方式是將它們拆分成小塊。您將美元符號和下一個不是下劃線,字母或數字的符號分開。一旦你做到了。你可以解析它變成一個變量。

$ var ='variable_name'; //先分割它

echo $$ var; //獲取給定變量

你是不是指這樣的事情?

4

我知道許多人建議你添加模板引擎,如果你想在你的情況來創建自己的,最簡單的方法是使用str_replace函數:

$index  = file_get_contents ("index.bel"); 
$replace_from = array ('$variable_a', '$variable_b'); 
$replace_to = array ($var_a_value, $var_b_value); 
$index  = str_replace($replace_from,$replace_to,$index); 

現在是簡單的變量替換,但你很快就會想要更多的標籤,更多的功能,並且有一種方法可以使用preg_replace_callback。你可能想看看它,因爲它最終實現,以取代變量,包括其他文件{include:file.bel},替換文本像{img:foo.png}

編輯:閱讀更多您的評論,您正在創建自己的框架。看看preg_replace_callback,因爲它給你更多的方式來處理事情。

很簡單,這裏例如:

... 
$index = preg_replace_callback ('/{([^}]+)}>/i', 'preg_callback', $index); 
... 

function preg_callback($matches) { 
    var_dump($matches); 

    $s = preg_split("/:/",$matches[1]); // string matched split by : 
    $f = 'func_'.strtolower($s[0]);  // all functions are like func_img,func_include, ... 
    $ret = $f($s);      // call function with all split parameters 

    return $ret; 
} 

function func_img($s) { 
    return '<img src="'.$s[1].'" />'; 
} 

從這裏也可以改善這一點(很多方法),例如將所有功能的類,如果你想。

相關問題