如何在不使用eval的情况下解析文件 - PHP?

时间:2017-11-23 12:06:21

标签: php

有没有其他方法来解析没有eval()的文件?我试图在不使用index.gs中的php标签的情况下呈现php代码,到目前为止我只能使用eval()。问题不仅在于解析变量,还有自定义模板字符。

以下是代码示例。

 $render = file_get_contents($this->file);

 $render = $this->parse_extends($render);
 $render = $this->parse_assets($render);
 $render = $this->parse_vars($render);
 $render = $this->parse_vars_skip($render);

  try {
        ob_start();
        eval('?>' . $render);
        $render = ob_get_contents();
    } finally {
        ob_get_clean();
    }
    return $render;

return $ render - 返回View :: class代码以获取响应

1 个答案:

答案 0 :(得分:1)

如果在allow_url_include中启用了php.ini指令,则可以使用

执行此代码
include "data://text/plain;base64," . base64_encode($render);

但默认情况下此设置已禁用,并且无法在用户代码中更改,只能通过编辑php.ini文件进行更改;所以除非在php.ini中明确启用(并且通常没有任何正当理由),否则它实际上不是一个选项。

另一种方法是创建一个临时文件,在那里编写代码,然后使用include:

执行它
$tempFilename = tempnam("/tmp", "MyTemplate");
file_put_contents($tempFilename, $render);
include $tempFilename;
unlink($tempFilename);

但两者都有类似的问题和对eval()的危险。