为什么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.