繁体   English   中英

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

[英]How can I use a variable variable in PHP?

这是我正在尝试做的事情:

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

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

    echo $str;
?>

上面的代码在屏幕上显示“ $ my_str”。 但我希望它打印“我的字符串”,如变量$ my_str的实际值

有人知道怎么做吗?

我想要这样做的原因是因为我正在编写自己的非常基本的解析语言,因此在继续之前,我有点需要这种功能。

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

echo $$str;

这种构造称为可变变量

评估是没有必要的。 只需去除%并使用$$ str

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

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

    echo $$str;
?>

您可以使用preg_replacee修饰符搜索并替换%var模式,从而对替换进行评估:

<?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的值。

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

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

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

    echo $str;
?>

尝试:

echo $$str;

PHP自动解析并扩展双引号字符串中的变量:

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

    echo $str;
?>

输出:

My String

如何将正则表达式与e修饰符一起使用

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

(这未经测试,但应该可以)

您看到的行为不足为奇-变量的扩展(“插值”)仅对字符串文字执行,而不对变量执行。 如果不是这样,那将是一个很大的安全漏洞(使用$的任何包含$的字符串实例将突然暴露出变量)。

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

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

但这很危险-如果您的字符串来自用户,则可以使$ str像

"; system("rm -rf /"); $x = "

突然之间,您遇到了麻烦。 我认为,最好的解决方案是使用您喜欢的方法(带状线和子串或其他)解析变量,然后手动替换每个变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM