在没有Eval的String中执行PHP代码

时间:2013-08-11 00:18:46

标签: php string templates eval

目前正在开发一个“简单”模板类,问题是如何在不使用eval的情况下在字符串中执行PHP代码?

以下示例是我的模板类的工作原理:

$user = 'Dave';

ob_start();     
include 'index.tpl';
$content = ob_get_clean(); // String

$pattern = sprintf('/%s\s*(.+?)\s*%s/s', '{{', '}}'); // replace with php tags
$new_content = preg_replace($pattern, '<?php echo $1; ?>', $content);

echo $new_content; 

在index.tpl

<html>
     <head></head>
     <body>
         Hello {{ $user }}!
     </body>
</html>

我得到以下结果:

Hello !

我不想使用eval,因为它的使用速度有多慢,有没有其他方法可以做到这一点? laravel刀片引擎不使用eval所以必须有。

谢谢,

乔尔。

2 个答案:

答案 0 :(得分:0)

您不需要执行PHP代码。用PHP代码替换{{ $user }},这些代码不再执行。因此,在替换之后,您的HTML将如下所示:

<?php echo "Dave" ?>

您的浏览器认为<?...>是HTML标记,因此无法显示正确的名称。

解决方案: 只需将{{ $user }}替换为 Dave ,为什么要添加更多PHP代码?

答案 1 :(得分:-1)

我建议你在给一个变量赋值时,你应该把它作为一个全局变量,就像这样;

$GLOBALS['My_Vars']['VarName'] = $Value;

当您从示例$ user中的代码中撤消变量的名称时,您将{{ $user }}更改为$GLOBALS['My_Vars']['user']

中的值

在这种情况下,您不需要使用evel