2011-03-09 133 views
3

在这里搜索和谷歌超过一个小时,似乎无法找到答案。php - 将单引号字符串转换为双引号

我有一个从包含变量的数据库查询返回的字符串,但它看起来这些字符串都返回单引号,因此变量不被评估,因为它们是如果它是双引号。

什么是从SQL查询返回的将是$结果:

这不会评估两个变量:

$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; 

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

感谢

回答

1

你可以做这样的事情:

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

但是,我坚决不推荐评估从数据库中的任何代码。任何超出您的控制范围的都是安全风险。

+4

唉,不使用eval,**特别是* *用于来自数据库的字符串。除非你有严格的控制或完美的清理琴弦,否则这可能是一个可怕的安全漏洞。 – 2011-03-09 05:45:04

+1

正如我在下面所说的代码片段;)更换方法会更适合,因为你张贴,但我真正回答了这个问题。有一个upvote – 2011-03-09 05:46:33

+0

哈哈,我的坏。我看到了'eval',我的视线变得模糊起来。 :D – 2011-03-09 05:49:09

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; 
} 
+0

+1,用于指向功能请求的链接 – chim 2014-03-14 11:21:39

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); 

,这将是比内森的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 
相关问题