По причинам, которые я бы предпочел не получить прямо сейчас, у меня есть строка вроде так:
<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; }