2011-07-14 57 views
2

我有一個生成HTML代碼像下面如何捕捉函數生成的HTML?

function j_uf_SomeFunction($some_var) { 
    ?><div class="db_photo"> 
     <img alt="<?php echo some_php_function ?>" src="<?php echo $some_var; ?>" /> 
    </div><?php 
} 

當然,它更先進,更添加各種用戶選項的PHP函數。

在大多數情況下,我把這個函數內聯,而不是把它附加到一個字符串。不過,我已經到了第一次出現(可能不是最後一次出現),我需要將呈現的HTML存儲在字符串中,而不是直接發送到解析器以構建頁面。

我需要關閉該功能,並告訴它將生成的html存儲並存儲在一個字符串中,而不是發送到頁面,只在某些情況下。

回答

5
function j_uf_SomeFunction($some_var) { 
    ob_start(); 
    ?><div class="db_photo"> 
     <img alt="<?php echo some_php_function ?>" src="<?php echo $some_var; ?>" /> 
    </div><?php 
    return ob_get_clean();//suggestion by GWW 
} 

ob_start()被起始緩衝液接收 ob_get_clean()清除當前的緩衝區,並返回它的值。在

更多信息http://php.net/manual/en/function.ob-start.php

OB *輸出緩衝

+0

因爲它沒有被明確地說過,所以稱爲「輸出緩衝」,因此稱爲「ob」。 – zzzzBov

+0

+1,(編輯:nevermind即時通訊錯誤) – Rob

+0

是的,感謝您追加信息...:) –

1

這聽起來像輸出緩衝器是一個可能的解決您的問題。

您使用的輸出緩衝器,像這樣:

ob_start(); 
j_uf_SomeFunction($someVar); 
$buffer = ob_get_contents(); 
ob_end_clean(); 

的$緩衝區變量現在包含任何由函數打印出來。

總是用ob_end_clean或ob_end_flush關閉輸出緩衝區很重要。你可以在這裏閱讀更多:http://php.net/manual/en/book.outcontrol.php

的問候, 克里斯

+0

謝謝,所以我應該在清潔結束時使用ob_end_flush? – JustinKaz

+0

這不是必需的,可能會導致警告。 ob_end_clean清除以ob_start開頭的輸出緩衝區,而ob_end_flush在清空輸出緩衝區之前打印輸出緩衝區中的內容。你或者使用其中一個:-) – cgwyllie

1

我沒有我有一個模板系統解析這個函數值成...它不是你的標準函數調用。

確保你...它僅僅指剛使用翻譯包含在函數中:-)

function j_uf_SomeFunction($some_var) { 
    $html = "<div class="db_photo"><img alt="%some_function_result%" src="%some_var%" /></div>"; 
    $tokens = array(
     '%some_var%' => $some_var, 
     '%some_function_call_result%' => some_function_call() 
    ); 

    return strtr($html, $tokens); // or echo 
} 

使用字符串操作:

function j_uf_SomeFunction($some_var) { 
    $html = '<div class="db_photo"><img alt="%s" src="%s" /></div>'; 

    return sprintf($html, some_function_call(), $some_var); //or echo 
} 

如果some_function_call實際輸出html直接用自己的echo然後jsut使用緩衝區:

function j_uf_SomeFunction($some_var) { 
    ob_start(); 
    some_function_call(); 
    $somefunc = ob_get_clean(); 

    $html = '<div class="db_photo"><img alt="%s" src="%s" /></div>'; 
    return sprintf($html, $somefunc, $some_var); //or echo 
} 
+0

太好了,現在你想讓我重寫我的整個Web服務......可怕的人。大聲笑。 – JustinKaz

+0

我發現在html中吐出上下文,進行線框和保持標準容易得多。這也是爲什麼我喜歡PHP的任何其他解決方案,希望我操縱整個網站的字符串...我正在做先進的數據處理...如果它仍然是明智的,我想它更好地堅持標準不。 – JustinKaz

+0

P.S.上述功能僅僅是一個例子......真正的功能連接到數據庫並打印出圖像。我正在調用此函數的函數使用類似「

{{title}}
{{image:{{urf}}}} {{post data}}
」的字符串,並解析用於構建訂單項(流發佈)的{{}}命令。這個paritucluar尋找{{image:x}}(使用正則表達式)並調用圖像採集卡。我基於我的例子的功能。還在繼續? – JustinKaz