【问题标题】:Execute PHP code in a String without Eval在没有 Eval 的字符串中执行 PHP 代码
【发布时间】:2013-08-12 14:49:39
【问题描述】:

目前正在开发一个“简单”的模板类,问题是如何在不使用 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 所以必须有。

谢谢,

乔尔。

【问题讨论】:

  • 曾经研究过模板引擎,例如 smarty?
  • 如果你只想从变量中放入东西,那么 str_replace 就可以了。
  • 您可以使用 Handlebars 或 Mustache 工程师模板。

标签: php string templates eval


【解决方案1】:

您不需要执行 PHP 代码。您将 {{ $user }} 替换为不再执行的 PHP 代码。所以你的 HTML 在替换后将如下所示:

<?php echo "Dave" ?>

您的浏览器认为 &lt;?...&gt; 是一个 HTML 标记,因此不会显示正确的名称。

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-21
      • 2010-11-14
      • 1970-01-01
      相关资源
      最近更新 更多