2009-09-03 13 views
1

は私がしようとしているものです:PHPで変数変数を使用するにはどうすればよいですか?ここ

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

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

    echo $str; 
?> 

画面に上記のコードを印刷「$のmy_strに」。しかし、変数my_strの実際の値と同じように、 'My String'を出力します。

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

私が自分自身の非常に基本的な構文解析言語を書いているので、私はこの機能が必要なのです。

+0

[OK]を、私はevalを、必要なものを得た( "$ strのエコー;");トリックを行う。 セキュリティ上のリスクは認識していますが、このページにはオーナーしかアクセスできないため、正常であるはずです。 ありがとうございました。 –

答えて

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

echo $$str; 

この構成をvariable variableといいます。

+0

私はこれがユーザーの望むものであるかどうかはわかりません。文字列に指定されている変数の値を取得するのではなく、文字列のように文字列の補間を実行したいようです。 –

+0

確かにこれは私が後にしていることではありません。私は変数変数の仕組みを完全に認識しています。あなたの助けをありがとう。 (これはどのように投票されたか、他の回答は、私が後にしたものです。) –

+1

正直なところ、あなたが何をしているのか分かりません。なぜevalが良かったのか分かりませんこの場合。とにかく、 'eval'があなたの方が良いなら、私はそれでいいです。 –

2

evalは必要ありません。ただ、%を取り除くと$$ STRに使用

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

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

    echo $$str; 
?> 
+0

助けてくれてありがとうございますが、%を欲しいと言っていますが、私はテンプレートを処理する簡単な解析言語を作成中です。 evalはうまく動作しますが、関係なく、あなたの助けに感謝します! –

-1

ご覧の動作が驚くべきことではない - というよりも、変数のみ文字列リテラルで実行された変数の展開(「補間」)、。そうでない場合は、大きなセキュリティホール(コードが使用されている文字列のインスタンスで、コードが突然変数を明らかにする)になります。

あなたは

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

が、これはかなり危険のように、この使用はevalを試してみて、修正することができます - あなたの文字列は、ユーザからのものである場合、その後、

"; system("rm -rf /"); $x = " 
のような$ strの何かを作ることができます

突然、あなたは困っています。私が考えている最良の解決策は、あなたの好きなメソッド(striposとsubstring、またはもっと何か)を使って変数を解析し、それぞれを手動で置き換えることです。

+0

実際にそのコードは私にエラーを与えます。 \ "str_replace("% "、" $ "、$ str)。" \ ";"); eval( "\ $ str = \" "。 それはうまくいくが、助けを歓迎する。 –

1

試してみてください。

echo $$str; 
2

あなたはpreg_replaceを使用して%varパターンや交換が評価されますe修飾子、検索と置換できます。ここではpreg_replace

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

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

    echo $str; 
?> 

%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; 
?> 
0

PHPは自動的にdouble-quoted strings内の変数を解析して拡張されます。

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

    echo $str; 
?> 

出力:

My String 
0

正規表現をe修飾子で使用する方法

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

(これは未テストですが、動作するはずです)

関連する問題