一直在这里搜索和谷歌超过一个小时,似乎无法找到答案。
我有一个从包含变量的数据库查询返回的字符串,但是看起来这些字符串都是单引号返回的,因此变量不会被评估,如果它是双引号的话。
从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;
我的问题是如何将单引号字符串转换为能够评估变量的双引号字符串?
由于
答案 0 :(得分: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;
}
答案 1 :(得分: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 Feed中的换行符有关,并且解决了这样的问题:
// 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
答案 2 :(得分:1)
你可以这样做:
<?php
$myname = 'david';
$occupation = 'Beginner';
eval("\$result = 'Hello my name is $myname and I my occupation is $occupation';");
echo $result;
?>
但是,我强烈建议不要评估数据库中的任何代码。任何不受控制的都是安全风险。