1

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

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

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

    echo $str;
?>

上面的代码将 '$my_str' 打印到屏幕上。但我希望它打印“我的字符串”,就像变量 $my_str 的实际值一样

有人知道怎么做吗?

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

4

7 回答 7

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

echo $$str;

这种构造称为变量 variable

于 2009-09-03T21:04:26.117 回答
2

You could search and replace the %var patterns using preg_replace and the e modifier, which makes the replacement being evaluated:

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

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

    echo $str;
?>

Here preg_replace will find %my_str, \1 contains my_str and "$\\1" (the backslash needs to be escaped) becomes the value of $my_str.

However, it would maybe be cleaner to store your replacement strings in an associative array:

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

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

    echo $str;
?>
于 2009-09-03T21:48:49.397 回答
2

eval 不是必需的。只需摆脱 % 并使用 $$str

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

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

    echo $$str;
?>
于 2009-09-03T21:06:05.677 回答
1

尝试:

echo $$str;
于 2009-09-03T21:07:36.563 回答
0

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

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

    echo $str;
?>

输出:

My String
于 2009-09-03T22:15:41.220 回答
0

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

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

(这是未经测试的,但应该工作)

于 2009-09-03T22:25:36.063 回答
-1

您看到的行为并不奇怪 - 变量的扩展(“插值”)仅在字符串文字上执行,而不是在变量上执行。如果不是,那么这将是一个很大的安全漏洞(您的代码使用的任何带有 $ 的字符串实例都会突然暴露变量)。

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

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

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

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

突然间,你遇到了麻烦。我相信,最好的解决方案是使用您最喜欢的方法(stripos 和 substring 或其他方法)解析变量,然后手动替换每个变量。

于 2009-09-03T21:06:21.480 回答