【问题标题】:Is it possible to render the content of a file without using eval in PHP?是否可以在 PHP 中不使用 eval 来呈现文件的内容?
【发布时间】:2012-06-01 09:34:12
【问题描述】:

我正在尝试在 PHP 中创建一个简单的框架,该框架将包含一个文件 (index.bel) 并呈现文件中的变量。例如,index.bel 可以包含以下内容:

<h1>{$variable_name}</h1>

如果不使用 eval 或要求框架的用户像这样键入 index.bel,我将如何实现这一点:

$index = "<h1>{$variable_name}</h1>";

换句话说:是否可以在不使用 eval 的情况下呈现文件的内容?我的问题的一个可行的解决方案是:

index.php:

<?php
$variable_name = 'Welcome!';
eval ('print "'.file_get_contents ("index.bel").'";');

index.bel:

<h1>{$variable_name}</h1>

【问题讨论】:

  • 一些正则表达式有什么问题要查找和str_replace...
  • 最好包含一个模板引擎类。例如 SMARTY(我觉得对 SMARTY 的厌恶)至少有一个模板引擎支持你自己的框架;它赞美它。
  • 使用模板引擎。

标签: php variables rendering eval file-get-contents


【解决方案1】:

我知道很多人建议您添加模板引擎,但是如果您想创建自己的,最简单的方法是使用 str_replace:

$index        = file_get_contents ("index.bel");
$replace_from = array ('$variable_a', '$variable_b');
$replace_to   = array ($var_a_value, $var_b_value);
$index        = str_replace($replace_from,$replace_to,$index);

现在这是用于简单的变量替换,但您很快就会想要更多的标签、更多的功能,以及使用preg_replace_callback 来完成这些事情的一种方法。你可能想看看它,因为它最终可以替换变量,包括其他文件{include:file.bel},替换像{img:foo.png} 这样的文本。

编辑:阅读更多您的 cmets,您正在创建自己的框架。看看preg_replace_callback,因为它为您提供了更多处理事情的方法。

这里是一个非常简单的例子:

...
$index = preg_replace_callback ('/{([^}]+)}>/i', 'preg_callback', $index);
...

function preg_callback($matches) {
  var_dump($matches);

  $s = preg_split("/:/",$matches[1]);  // string matched split by :
  $f = 'func_'.strtolower($s[0]);      // all functions are like func_img,func_include, ...
  $ret = $f($s);                       // call function with all split parameters

  return $ret;
}

function func_img($s) {
  return '<img src="'.$s[1].'" />';
}

您可以从这里改进(通过多种方式),例如,如果您愿意,可以将所有功能划分为类。

【讨论】:

    【解决方案2】:

    是的,这是可能的,但你为什么要制作自己的框架?您提供的代码显然看起来像 Smarty 模板。你可以试试看他们是怎么做到的。

    运行这些代码的一种可能方法是将它们分成几部分。您拆分美元符号和下一个不是下划线、字母或数字的符号。一旦你这样做了。你可以把它解析成一个变量。

    $var = '变量名'; // 先拆分

    回显 $$var; // 获取给定的变量

    你的意思是这样的吗?

    【讨论】:

      猜你喜欢
      • 2012-01-08
      • 2015-01-27
      • 2012-07-09
      • 2016-08-30
      • 1970-01-01
      • 1970-01-01
      • 2019-12-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多