2009-09-03 9 views
1

Voici ce que je suis en train de faire:Comment puis-je utiliser une variable variable en PHP?

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

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

    echo $str; 
?> 

Les impressions de code ci-dessus de la my_str de $ 'à l'écran. Mais je veux imprimer 'My String', comme dans la valeur réelle de la variable $ my_str

Quelqu'un sait-il comment faire?

La raison pour laquelle je veux ceci est parce que je suis en train d'écrire mon propre langage d'analyse très basique, donc j'ai un peu besoin que ce soit fonctionnel avant de pouvoir continuer.

+0

Ok je suis ce que je avais besoin, eval ("echo $ str;"); fait le tour. Je suis conscient des risques de sécurité, mais cette page ne peut être accessible que par le propriétaire, donc ça devrait aller. Merci pour toute l'aide. –

Répondre

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

echo $$str; 

Cette construction est appelée variable variable.

+0

Je ne suis pas sûr que c'est ce que l'utilisateur voulait - ils semblent vouloir effectuer une interpolation de la chaîne, comme s'il s'agissait d'un littéral, plutôt que de simplement obtenir la valeur de la variable nommée dans la chaîne. –

+0

En effet, ce n'est certainement pas ce que je suis après. Je suis complètement conscient de la façon dont les variables variables fonctionnent. Merci quand même pour vôtre aide. (Bizarre comment cela est voté et les autres réponses, qui sont exactement ce que je voulais, sont rejetées) –

+1

Honnêtement, je ne comprends pas ce que vous vouliez et je ne comprends pas pourquoi 'eval' était mieux dans ce cas. De toute façon, si 'eval' est meilleur pour toi, ça me va. –

2

eval n'est pas nécessaire. Il suffit de se débarrasser de l'% et utiliser $$ str

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

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

    echo $$str; 
?> 
+0

Merci pour l'aide mais je veux le%, comme je l'ai dit, je suis en train de faire un langage d'analyse simple qui traite les modèles. Eval fonctionne très bien, mais merci pour votre aide malgré tout! –

-1

Le comportement que vous voyez est pas surprenant - l'expansion des variables (« interpolation ») est réalisée sur littéraux de chaîne, plutôt que des variables. Si ce n'était pas le cas, il s'agirait d'un trou de sécurité important (toute instance d'une chaîne contenant $ dans laquelle votre code serait soudainement révélateur de variables).

Vous peut essayer de résoudre ce problème en utilisant eval, comme dans

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

mais assez dangereux - si votre chaîne est de l'utilisateur, peut alors faire quelque chose $ str comme

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

et soudainement, vous êtes en difficulté. La meilleure solution, je crois, sera d'analyser les variables en utilisant vos méthodes préférées (stripos et sous-chaîne, ou quelque chose de plus), puis remplacer chacun à la main.

+0

En fait ce code me donne des erreurs. eval ("\ $ str = \" ". Str_replace ("% "," $ ", $ str)." \ ";"); Cela fonctionne bien, encourage l'aide. –

2

Vous pouvez rechercher et remplacer les %var motifs à l'aide preg_replace et le modificateur e, ce qui rend le remplacement en cours d'évaluation:

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

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

    echo $str; 
?> 

Ici preg_replace trouverez %my_str, \1 contient my_str et "$\\1" (le backslash doit être échappé) devient la valeur de $ my_str.

Cependant, il serait peut-être plus propre pour stocker vos chaînes de remplacement dans un tableau associatif:

<?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 parse automatiquement et développe des variables au sein double-quoted strings:

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

    echo $str; 
?> 

Sorties:

My String 
0

Que diriez-vous d'utiliser une regex avec le modificateur e

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

(Ceci est non testé, mais devrait fonctionner)