2011-07-17 60 views
0

有故障的結果我現在得到的是:17th of July, 2011Today is .如何解決PHP preg_replace()錯誤的結果順序?

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.

回答

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

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

不期望的結果,因爲你打印date,然後finclude返回null,然後打印"Today is "+finclude

0

我認爲你需要把<?php return date('jS \of F'); ?>在date.php

1

你叫什麼在結果順序錯誤實際上是由您的語句的執行順序造成的:

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

將啓動輸出(echo),然後調用preg_replace函數。其中您使用e - eval修飾符來執行代碼,即功能finclude

所以finclude get的執行更早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修飾符總是很危險,通常應該防止它。所以保重。

+0

混合執行順序和輸出順序的人應首先了解該部分,以便爲應用程序獲得更多健康和安全。我希望我的回答很有見地。一路上預防eval可能會有所幫助。我認爲獲得同樣結果的最可靠的方法是,您要求自己創建一個代碼的變體,該變體不帶任何作用,可以作爲某種有趣的課程。 – hakre

+0

你的代碼片段似乎更加正確,並會返回'今天是2011年7月17日。 – Binyamin