如何修复PHP preg_replace()错误的结果顺序?

时间:2011-07-17 10:14:58

标签: php include preg-replace

我现在得到的错误结果是:17th of July, 2011Today is .

function finclude($file){
    include($file);
}
$str = "Today is {include 'date.php'}.";
echo preg_replace("/\{include '(.*)\'}/e", 'finclude("$1")', $str);

date.php:

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

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

3 个答案:

答案 0 :(得分:2)

function finclude($file){
    return include($file);
}

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

不期望结果,因为您打印date,然后finclude返回null,然后打印"Today is "+finclude

答案 1 :(得分:1)

您在结果顺序中调用的错误实际上是由语句的执行顺序引起的:

echo preg_replace("/\{include '(.*)\'}/e", 'finclude("$1")', $str);

将启动输出(echo),然后调用preg_replace函数。您使用e - eval修饰符来执行代码,即函数finclude

所以finclude先前执行 而不是preg_replace将会返回它的结果。

因此,如果finclude自行输出,则会在前面显示 preg_replace的结果。

知道这是解决问题的一半。你很可能没有打算这个输出顺序(你的预期结果不同),你只是想让finclude返回一个值而不是输出一些东西。要将输出转换为返回值,可以使用输出缓冲区:

function finclude($file){
    ob_start();
    include($file);
    return ob_get_clean();
}
$str = "Today is {include 'date.php'}.";
echo preg_replace("/\{include '(.*)\'}/e", 'finclude("$1")', $str);

这将确保finclude内的每个输出都将作为返回值返回。

完成后,您可以重复使用通常在搜索和替换操作中输出的现有代码/包含。但是,使用e修饰符始终是危险的,通常应该防止它。所以要小心。

答案 2 :(得分:0)

我认为您需要将<?php return date('jS \of F'); ?>放入date.php