3

在这里和谷歌搜索了一个多小时,似乎无法找到答案。

我有一个从包含变量的数据库查询返回的字符串,但是这些字符串似乎都是单引号返回的,因此变量不会像双引号一样被评估。

从 sql 查询返回的是 $result:

这不会评估 2 个变量:

$myname = 'david';
$occupation = 'Beginner';
$result = 'Hello my name is $myname and I my occupation is $occupation';
echo $result;

这将评估 2 个变量:

$myname = 'david';
$occupation = 'Beginner';
$result = "Hello my name is $myname and I my occupation is $occupation";
echo $result;

我的问题是如何将单引号字符串转换为能够评估变量的双引号字符串?

谢谢

4

3 回答 3

6

PHP 目前没有标准的安全方法来执行此操作。多年来一直有一个开放的功能请求要求它:http ://bugs.php.net/bug.php?id=43901

票上的一条评论提供了一个正则表达式来做简单$foo${foo}替换:

function stringExpand($subject, array $vars) {
  foreach ($vars as $name => $value) {
    $subject = preg_replace(sprintf('/\$\{?%s\}?/', $name), $value, $subject);
  }
  return $subject;
}
于 2011-03-09T05:43:17.777 回答
2

如果您知道要替换的变量的名称,则可以这样做...

$myname = 'david';
$occupation = 'Beginner';
$result = 'Hello my name is $myname and I my occupation is $occupation';

$result = str_replace( 
              array('$myname', '$occupation'),  
              array($myname, $occupation),
              $result );

这将比 Nathan 的 stringExpand 函数更快,但如果您不知道变量名称,请使用 Nathan 的方法。

当我发现这个问题时,我试图解决的问题与 csv 提要中的换行符有关,并且解决了如下问题:

// string from drupals csv feed tamper settings
$string = '22 Acacia Avenue\n Irlam\n Manchester'; 
$string = str_replace('\n', "\n", $string);
print nl2br($string); // demonstrates that the \n's are now linebreak characters
于 2013-02-19T10:57:55.730 回答
1

你可以这样做:

<?php
$myname = 'david';
$occupation = 'Beginner';
eval("\$result = 'Hello my name is $myname and I my occupation is $occupation';");
echo $result;
?>

但是,我强烈不建议评估数据库中的任何代码。任何超出您控制的事情都是安全风险。

于 2011-03-09T05:39:39.860 回答