-2

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

<h1>{$variable_name}</h1>

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

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

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

索引.php:

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

索引.bel:

<h1>{$variable_name}</h1>
4

2 回答 2

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].'" />';
}

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

于 2012-06-01T09:47:04.747 回答
0

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

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

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

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

你的意思是这样的吗?

于 2012-06-01T09:39:12.290 回答