如何处理文本字符串中的PHP代码,以防止其被视为文本


How to process PHP code in a text string, to prevent it from being seen as text?

我在自定义构建的CMS中使用Redactor编辑器。Redactor有一个选项phpTags,当设置为true时,允许输入PHP代码并将其作为内容的一部分保存。

问题是,这个PHP代码被视为文本,而不是PHP代码,并且被转义而不是被处理。

例如,如果我在编辑器中输入以下内容:

<?php echo date('Y'); ?>

代码不是显示年份,而是在页面的标记中注释掉,如下所示:

<!--?php echo date('Y'); ?-->

我该如何防止这种情况发生?要确保PHP代码被服务器这样处理/解释吗?

我可能应该提到,有很多人使用这个CMS,所以没有办法提前知道可能添加了什么PHP代码。

也许

<!-- <?php echo date('Y') ?> -->

您不能像现在这样更改PHP的打开/关闭标记,除非重新编译PHP。如果您想隐藏php的输出,那么用html注释标记包围整个php代码块。

PHP不会在意html注释。它根本不在乎它嵌入了什么。你可以把一个PHP代码块塞进.jpg文件的中间,它仍然会执行,只要网络服务器被配置为通过PHP解释器运行.jpg文件。

为了解决这个问题,我将之前刚刚通过echo显示的内容保存到一个临时文件中。

然后,我打开输出缓冲,将该临时文件包含在PHP脚本中,并通过ob_get_contents()获取其内容。

这使我能够显示其中所有PHP都已解析的内容。这是供参考的代码:

// Create path to temporary file
$tmpPath = '/temp.php';
// Set file variable to null for error checking
$tmpFile = NULL;
// Try creating the temporary file
if ( $tmpFile = fopen($tmpPath, 'w') ) {
   if ( fwrite($tmpFile, $postContent) === FALSE ) {
      // Do something if the file can't be written to
   } else {
      // Close file
      fclose($tmpFile);
   }
}
// Start output buffereing
ob_start();
// Include the temporary file created above
include $tmpPath;
// Save buffered contents to a variable
$content = ob_get_contents();
// End output buffering
ob_end_clean();
// Display content
echo $content;

我很感激对我的问题的各种评论,因为它帮助我朝着正确的方向去解决这个问题。