2011-05-03 73 views
1

至於原因,我寧願不進去,現在,我有一個字符串,像這樣:PHP讓我從EVAL)變量裏面串

<div>$title</div> 
是被存儲在使用 mysql_real_escape_string數據庫

在正常的腳本執行過程中,該字符串被解析並存儲在變量$string中,然後被髮送到function($string)

在此功能,我想:

function test($string){ 
    $title = 'please print'; 
    echo $string; 
} 
//I want the outcome to be <div>please print</div> 

這似乎是最愚蠢的事情,但對我的生活,我不能讓它「解釋」變量。

我也試過,

echo html_entity_decode($string); 
echo bin2hex(html_entity_decode($string)); //Just to see what php was actually seeing I thought maybe the $ had a slash on it or something. 

我決定張貼在這裏就當我的腦海裏不停地飄過來使用EVAL()

這當然只是僞代碼。解決這個問題的最好方法是什麼?

回答

1

我不認爲有辦法讓這個工作。您正在嘗試如下所示:

$var = "cute text"; 
echo 'this is $var'; 

單引號阻止解釋器在字符串中查找變量。當你迴應一個字符串變量時,情況也是如此。

該解決方案將是一個簡單的str_replace

echo str_replace('$title', $title, $string); 

但在這種情況下,我真的建議模板變量,在您的文字是獨一無二的。

+0

Smarty圍繞PHP樣式var {$ like} {$ these}使用大括號。 – 2011-05-03 13:00:19

+0

只需要注意,如果將單個撇號更改爲雙撇號,則第一個示例將起作用,這也適用於設置字符串變量,因此它不一定在回顯字符串變量時使用。如果你設置了'$ string ='這是$ var';'你會得到正確的回聲,但是使用'$ string =「這是$ var」;'當echo $時你會得到'這是可愛的文本' string'。 – Scoobler 2011-05-03 13:23:58

+0

@Scoobler你是對的。我發佈的片段只是爲了說明問題示例中會發生什麼。 – Frank 2011-05-03 13:34:23

1

你只是不這樣做,一個變量是一個活的東西,它存儲它就像它的性質,扁平和死亡的數據庫中的字符串。

如果要用變量的內容替換字符串的某些部分,請使用sprintf()

$stringFromTheDb = '<div>%s is not %s</div>'; 

然後與使用它:

$finalString = sprintf($stringFromTheDb, 'this', 'that'); 

echo $finalString; 

將導致:

<div>this is not that</div> 
+0

我怎麼能忘記這個?那麼兩個答案(我的和這個)都有用例,但總的來說我更喜歡這個。 +1 – Frank 2011-05-03 13:06:53

3

你的例子是有點抽象。但好像你可以做幾乎什麼模板引擎對這些情況做:

function test($string){ 
    $title = 'please print'; 

    $vars = get_defined_vars(); 
    $string = preg_replace('/[$](\w{3,20})/e', '$vars["$1"]', $string); 

    echo $string; 
} 

現在實際上,/e幾乎是一樣的使用eval。但至少這隻能取代實際的變量名稱。還可以做得更復雜一些。

1

如果你知道div裏面的變量是$title,你可以str_replace它。

function test($string){ 
    $title = 'please print'; 
    echo str_replace('$title', $title, $string); 
} 

如果你不知道該字符串中的變量,你可以使用正則表達式,讓他們(我用正則表達式從PHP manual)。

function test($string){ 
    $title = 'please print'; 
    $vars = '/(?<=\$)[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/'; 
    preg_match_all($vars, $string, $replace); 
    foreach($replace[0] as $r){ 
    $string = str_replace('$'.$r, $$r, $string); 
    } 
    echo $string; 
}