我正在尝试在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>
答案 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; //获取给定变量
你的意思是这样吗?