2

我需要将数据存储在数据库中,当我从数据库中获取数据时,我需要字符串中的函数和变量这样计算。

例子

$str = "<p>Dear {$this->name},</p>"

然后我将它存储在数据库中,当我检索字符串并运行它时

eval("\$detail= \"$detail\";");

然后变量被填充名称。这正是我所需要的并且工作正常。

问题是我想以这个变量作为参数运行一个函数。

例子。我想ucwords变量。

我努力了:

$str = "<p>Dear {ucwords($this->name)},</p>"  //just echoed {ucword(->name)},
$str = "<p>Dear {ucwords($this->name)},</p>"  //Fatal error: Function name must be a string,

我是否朝着正确的方向前进?这是可能吗?

4

3 回答 3

3

您不需要将 PHP 代码保存在数据库中。这是一种不好的做法,也可能导致安全漏洞。

而是像这样存储在数据库字符串中:

<p>Dear [name],</p>

当你检索它时,你可以这样做:

$stringFromDb = str_replace("[name]", $this->name, $stringFromDb);

或者

$stringFromDb = str_replace("[name]", ucwords($this->name), $stringFromDb);

其他常见的方法是使用sprintf. 因此,您需要将%s值作为占位符存储在数据库字符串中。

例子:

<p>Dear %s,</p>

并替换为

$stringFromDb = sprintf($stringFromDb, ucwords($this->name));
于 2013-01-09T14:56:57.403 回答
1

您似乎正在寻找一种简单的模板语言。

自从我编写 PHP 以来已经有很长一段时间了(我突然想起了为什么......),但这是我突然想到的。

它应该支持对象 ( $a->name) 和数组 ( $a["name"]) 作为输入对象。

您可以在$valid_filters.

$valid_filters = array("title" => "ucfirst", "upper" => "strtoupper");

function _apply_template_helper($match) {
  global $_apply_template_data, $valid_filters;
  $var = $match[1];
  $filter = $valid_filters[trim($match[2], ':')];
  $value = is_array($_apply_template_data) ? $_apply_template_data[$var] : $_apply_template_data->$var;
  if($filter && !empty($value)) $value = call_user_func($filter, $value);
  return !empty($value) ? $value : $match[0];
}

function apply_template($template, $data) {
  global $_apply_template_data;
  $_apply_template_data = $data;
  $result = preg_replace_callback('/\{\{(.+?)(:.+?)?\}\}/', "_apply_template_helper", $template);
  $_apply_template_data = null;
  return $result;
}

如何使用它:

$template = "Hello {{name:title}}, you have been selected to win {{amount}}, {{salutation:upper}}";
echo apply_template($template, array("name"=>"john", "amount" => '$500,000', "salutation" => "congratulations"));

结果:

你好,约翰,你被选中赢得 500,000 美元,恭喜

于 2013-01-09T15:26:19.553 回答
0

我找到了以下作品,

如果我在类本身中包含该函数,则可以使用以下代码调用它

<p>Dear {\$this->properCase(\$this->rl_account->name)},</p>

但是我希望现在能够做到这一点,而无需让数据库拥有 Alex Amiryan 之前提到的代码。

于 2013-01-09T15:11:46.153 回答