PHP让我远离eval;)字符串中的变量

时间:2011-05-03 12:44:58

标签: 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()时,我决定在这里发帖。

当然,这只是伪代码。解决这个问题的最佳方式是什么?

4 个答案:

答案 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;
}