由于我现在不想进入的原因,我有一个像这样的字符串:
<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()
时,我决定在这里发帖。
当然,这只是伪代码。解决这个问题的最佳方式是什么?
答案 0 :(得分: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 :(得分:1)
我认为没有办法让它发挥作用。你正在尝试这样的事情:
$var = "cute text";
echo 'this is $var';
单引号阻止解释器查找字符串中的变量。当你回显一个字符串变量时,它是一样的。
解决方案将是一个简单的str_replace
。
echo str_replace('$title', $title, $string);
但是在这种情况下,我真的建议你的文字中唯一的模板变量。
答案 2 :(得分:1)
你只是不这样做,变量是一个有生命的东西,它的性质与它的存储方式相反,在数据库中以字符串形式存放并且死了。
如果您想用变量的内容替换字符串的某些部分,请使用sprintf()
。
实施例
$stringFromTheDb = '<div>%s is not %s</div>';
然后将其用于:
$finalString = sprintf($stringFromTheDb, 'this', 'that');
echo $finalString;
将导致:
<div>this is not that</div>
答案 3 :(得分: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;
}