PHP удерживает меня от eval;) Переменные внутри строки - PullRequest
1 голос
/ 03 мая 2011

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

<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().

Это, конечно, просто псевдокод.Как лучше всего подойти к этому?

Ответы [ 4 ]

3 голосов
/ 03 мая 2011

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

function test($string){
   $title = 'please print';

   $vars = get_defined_vars();
   $string = preg_replace('/[$](\w{3,20})/e', '$vars["$1"]', $string);

   echo $string;
}

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

1 голос
/ 03 мая 2011

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

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;
}
1 голос
/ 03 мая 2011

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

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

Пример

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

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

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

echo $finalString;

приведет к:

<div>this is not that</div>
1 голос
/ 03 мая 2011

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

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

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

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

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

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

...