如何在PHP中使用变量变量?

时间:2009-09-03 20:58:12

标签: php variables variable-variables

以下是我要做的事情:

<?php
    $my_str = "My String";
    $str = "%my_str";

    $str = str_replace("%", "$", $str);

    echo $str;
?>

上面的代码将'$ my_str'打印到屏幕上。但我希望它打印'My String',就像变量$ my_str

的实际值一样

任何人都知道怎么做?

我想要这个的原因是因为我正在编写自己的,非常基本的解析语言,所以我需要这个才能继续使用。

7 个答案:

答案 0 :(得分:9)

$my_str = 'My String';
$str    = 'my_str';

echo $$str;

这种结构称为variable variable

答案 1 :(得分:2)

没有必要。只需摆脱%并使用$$ str

<?php
    $my_str = "My String";
    $str = "%my_str";

    $str = str_replace("%", "", $str);

    echo $$str;
?>

答案 2 :(得分:2)

您可以使用%varpreg_replace修饰符搜索并替换e模式,这样可以评估替换:

<?php
    $my_str = "My String";
    $str = "Foo %my_str bar";

    $str = preg_replace("/%([A-Za-z_]+)/e", "$\\1", $str);

    echo $str;
?>

此处preg_replace会找到%my_str\1包含my_str"$\\1"(反斜杠需要转义)会成为$ my_str的值。< / p>

但是,将替换字符串存储在关联数组中可能更简洁:

<?php
    $replacements = array(
        "my_str" => "My String",
    );
    $str = "Foo %my_str bar";

    $str = preg_replace("/%([A-Za-z_]+)/e", '$replacements["\\1"]', $str);

    echo $str;
?>

答案 3 :(得分:1)

尝试:

echo $$str;

答案 4 :(得分:0)

PHP自动解析和扩展double-quoted strings中的变量:

<?php
    $my_str = "My String";
    $str = "{$my_str}";

    echo $str;
?>

输出:

My String

答案 5 :(得分:0)

如何使用带有e修饰符的正则表达式

$str = preg_replace("/%([a-zA-Z0-9_]+)/e", '$\1', $str);

(这是未经测试的,但应该有效)

答案 6 :(得分:-1)

您看到的行为并不令人惊讶 - 变量扩展(“插值”)仅对字符串文字而不是变量执行。如果不是,那么它将是一个很大的安全漏洞(任何带有$ in的字符串实例,你的代码会突然显示变量)。

可以尝试使用eval修复此问题,如

eval ("\$str = \"" . str_replace("%", "\$", $str) . "\"");

但这非常危险 - 如果你的字符串来自用户,那么可以使$ str类似

"; system("rm -rf /"); $x = "
突然间,你遇到了麻烦。我相信,最好的解决方案是使用您喜欢的方法(stripos和substring,或更多)解析变量,然后手动替换每个变量。