PHP держит меня от eval;) Переменные внутри строки

По причинам, которые я бы предпочел не получить прямо сейчас, у меня есть строка вроде так:

<div>$title</div> 

который хранится в базе данных с помощью mysql_real_escape_string .

Во время обычного выполнения скрипта эта строка обрабатывается и сохраняется в переменной $string а затем отправляется в function($string) .

В этой функции я пытаюсь:

 function test($string){ $title = 'please print'; echo $string; } //I want the outcome to be <div>please print</div> 

Это похоже на самую глупую вещь, но для моей жизни я не могу заставить ее «интерпретировать» переменные.

Я также пробовал,

 echo html_entity_decode($string); echo bin2hex(html_entity_decode($string)); //Just to see what php was actually seeing I thought maybe the $ had a slash on it or something. 

Я решил опубликовать здесь, когда мой разум продолжал использовать EVAL() .

Конечно, это просто псевдокод. Каков наилучший способ приблизиться к этому?

Я не думаю, что есть способ заставить это работать. Вы пытаетесь сделать что-то вроде этого:

 $var = "cute text"; echo 'this is $var'; 

Одиночные кавычки не позволяют интерпретатору искать переменные в строке. И это то же самое, когда вы повторяете строковую переменную.

Решение будет простым str_replace .

 echo str_replace('$title', $title, $string); 

Но в этом случае я действительно предлагаю переменные шаблона, которые уникальны в вашем тексте.

Ваш пример немного абстрактный. Но похоже, что вы могли бы сделать очень многое, что двигатели шаблонов для этого случая:

 function test($string){ $title = 'please print'; $vars = get_defined_vars(); $string = preg_replace('/[$](\w{3,20})/e', '$vars["$1"]', $string); echo $string; } 

На самом деле, /e в значительной степени совпадает с использованием eval. Но по крайней мере это только заменяет имена фактических переменных. Может быть сделано еще немного сложнее.

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

Если вы хотите заменить некоторые части строки содержимым переменной, используйте sprintf() .

пример

 $stringFromTheDb = '<div>%s is not %s</div>'; 

Затем используйте его с:

 $finalString = sprintf($stringFromTheDb, 'this', 'that'); echo $finalString; 

приведет к:

 <div>this is not that</div> 

Если вы знаете, что переменная внутри div равна $title , вы можете str_replace .

 function test($string){ $title = 'please print'; echo str_replace('$title', $title, $string); } 

Если вы не знаете переменные в строке, вы можете использовать регулярное выражение для их получения (я использовал регулярное выражение из руководства PHP ).

 function test($string){ $title = 'please print'; $vars = '/(?<=\$)[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/'; preg_match_all($vars, $string, $replace); foreach($replace[0] as $r){ $string = str_replace('$'.$r, $$r, $string); } echo $string; }