为什么PHP preg_replace{include';date.PHP';}不返回PHP并打印<;?


Why PHP preg_replace {include 'date.php'} does not return php and prints <?php echo date('jS of F'); ?>

为什么PHP preg_replace{include‘date.PHP’}不返回PHP?没有eval如何解决?

header('Content-Type:text/plain');
$str = "Today is {include 'date.php'}.";
echo preg_replace("/'{include '(.*)''}/e", 'file_get_contents("$1")', $str);

date.php内容:

<?php echo date('jS 'of F'); ?>, 2011


结果:Today is <?php echo date('jS 'of F'); ?>, 2011.

预期结果:Today is 13th of July.

通过你表达问题的方式,你似乎知道你把文件的内容包含在了一个字符串文本中,所以它没有得到评估。

你也知道eval不是最好的函数,并且想知道如何避免它。这很好。

你想做的是把一个函数放在date.php中。在你的主文件中包括这个函数,而不是字符串。在需要内容的地方,调用函数。

除非您使用eval()(我不建议使用(,否则您真的不能指望.php文件会在调用时执行include()所做的是使您包含的文件中的代码可用于脚本,而不仅仅是执行它。这就是web服务器调用的引擎所做的。如果你想做到这一点,你必须在date.php网址上使用类似file_get_contents()的东西,这将使web服务器执行它并将结果返回给你。

实际上,在这种情况下,如果在date.php中维护代码的区别真的很重要,那么编写一个返回日期字符串的函数,然后随时调用它。你甚至可以将它包装在date.php中的一个类中(只是不要称它为"date"(,然后在你想执行它的地方用MyDate::myDateFunction()调用它。

更改date.php以返回值:

<?php return date('jS 'of F') . ', 2011';

然后,在您的主文件中,您可以执行以下操作:

$date = include 'date.php';
echo 'Today is ' . $date;

它有效,但不是很好。我建议重构您的代码。

如果你想捕获(而不仅仅是打印(包含的PHP脚本的输出,而你不能更改它,你必须做一个丑陋的解决方法:

<?php
ob_start();
include 'date.php';
$date = ob_get_contents();
ob_end_clean();
$str = "Today is {$date}.";
?>

这是没有'e eval:的解决方案

$str = "{include 'hello.php'}Today is {include 'date.php'}.";
echo preg_replace_callback("/'{include '(.*?)''}/", function($m) {
  return include($m[1]);
}, $str);

hello.php

<?php return "Hello!'n"; ?>

date.php

<?php return date('jS 'of F'); ?>, 2011

结果:Hello! Today is 21st of July.