2009-09-03 1 views
1

Вот что я пытаюсь сделать:Как использовать переменную переменной в PHP?

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

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

    echo $str; 
?> 

Приведенный выше код печатает «$ my_str» на экран. Но я хочу, чтобы он печатал «My String», как в фактическом значении переменной $ my_str

Кто-нибудь знает, как это сделать?

Причина, по которой я хочу, это потому, что я в процессе написания собственного, очень простого языка синтаксического анализа, поэтому мне нужно, чтобы это было функциональным, прежде чем я смогу продолжить.

+0

Хорошо я получил то, что мне было нужно, Eval ("Эхо $ ул;"); делает трюк. Я знаю об угрозах безопасности, но эта страница может быть доступна только владельцу, поэтому все должно быть хорошо. Спасибо за помощь. – 2009-09-03 21:10:20

ответ

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

echo $$str; 

Эта конструкция называется variable variable.

+0

Я не уверен, что это то, чего хотел пользователь - они, похоже, хотят выполнить интерполяцию строки, как если бы она была буквальной, а не просто получать значение переменной, названной в строке. –

+0

Действительно, это, безусловно, не то, что я хочу. Я полностью понимаю, как работают переменные переменные. Спасибо за вашу помощь. (Странно, как это проголосовали, а другие ответы, которые были именно тем, чем я был, проголосовали) – 2009-09-03 21:15:18

+1

Честно говоря, я не понимаю, что вы были после, и я не понимаю, почему «eval» был лучше в этом случае. В любом случае, если 'eval' лучше для вас, я в порядке с этим. –

2

eval не требуется. Просто избавиться от% и использовать $$ ул

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

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

    echo $$str; 
?> 
+0

Спасибо за помощь, но я хочу%, как я уже сказал, я в процессе создания простого языка синтаксического анализа, который обрабатывает шаблоны. eval отлично работает, но спасибо за вашу помощь! – 2009-09-03 21:08:42

-1

поведение вы видите, не удивительно - расширение переменных («интерполяция») выполняется только на строковых литералов, а не переменных. Если бы это не так, то это была бы большая дыра в безопасности (любой экземпляр строки с $ в ней, которую использовал ваш код, внезапно показывал переменные).

Вы можете попытаться исправить это с помощью Eval, как в

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

, но это очень опасно - если ваша строка от пользователя, то можно сделать $ ул что-то вроде

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

и вдруг у вас проблемы. Лучшее решение, я считаю, будет заключаться в том, чтобы анализировать переменные, используя ваши любимые методы (stripos и substring, или что-то еще), а затем заменять каждый из них вручную.

+0

На самом деле этот код дает мне ошибки. eval ("\ $ str = \" ". Str_replace ("% "," $ ", $ str)." \ ";"); Это работает, хотя и приветствует помощь. – 2009-09-03 21:12:51

2

Вы можете найти и заменить %var шаблонов, используя preg_replace и e модификатора, который делает замену оценивается:

<?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; 
?> 
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); 

(Это проверялось, но должно работать)

 Смежные вопросы

  • Нет связанных вопросов^_^