1

これが私がやろうとしていることです:

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

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

    echo $str;
?>

上記のコードは、「$my_str」を画面に出力します。しかし、変数 $my_str の実際の値のように、「My String」を出力したい

誰でもこれを行う方法を知っていますか?

これが必要な理由は、独自の非常に基本的な解析言語を書いている最中なので、続行する前にこれが機能する必要があるからです。

4

7 に答える 7

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

echo $$str;

この構造は可変変数と呼ばれます。

于 2009-09-03T21:04:26.117 に答える
2

および修飾子%varを使用してパターンを検索および置換できます。これにより、置換が評価されます。preg_replacee

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

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

    echo $str;
?>

ここでpreg_replaceは、find %my_str\1containsmy_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;
?>
于 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 や部分文字列など) を使用して変数を解析し、それぞれを手動で置き換えることだと思います。

于 2009-09-03T21:06:21.480 に答える