是否可以在PHP中不使用eval来呈现文件的内容?

时间:2012-06-01 09:34:13

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

我正在尝试在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>

2 个答案:

答案 0 :(得分:4)

我知道很多人建议你添加模板引擎,如果你想创建自己的,最简单的方法就是使用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}等文本。

编辑:阅读更多您的评论,您正在创建自己的框架。看一下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].'" />';
}

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

答案 1 :(得分:0)

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

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

$ var ='variable_name'; //首先拆分

echo $$ var; //获取给定变量

你的意思是这样吗?