在没有Eval的字符串中执行PHP代码


Execute PHP code in a String without 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,所以必须有.

您不需要执行PHP代码。您将{{ $user }}替换为不再执行的PHP代码。所以你的HTML在替换后会是这样的:

<?php echo "Dave" ?>

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

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

我建议您在为变量赋值时,应该像这样将其作为全局变量;

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

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

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