2010-04-06 36 views
3

我編寫了一個腳本來發送html電子郵件,並且一切正常。我把電子郵件存儲在一個單獨的HTML文件中,然後使用while循環和fgets()讀取。不過,我希望能夠將變量傳遞給html。例如,在一個HTML文件,我可能有這樣的事情..將HTML文件讀取到電子郵件中

<body> 
    Dear Name <br/> 
    Thank you for your recent purhcase 
</body> 

和我讀這爲一個字符串,像這樣

$file = fopen($filename, "r"); 
while(!feof($file)) { 
    $html.= fgets($file, 4096); 
} 
fclose ($file); 

我希望能夠在HTML取代「名稱」文件由變量和即時通訊不完全確定的最佳方式來做到這一點。我總是可以製作自己的標籤,然後使用正則表達式來替換名稱,只要將該文件讀入字符串,但是我想知道是否有更好/更簡單的方法來執行此操作。

(在一個側面說明,如果有人知道是否它能夠更好地使用的file_get_contents,而不是多次調用與fgets,身份證有興趣知道)

回答

4

str_replace()也有潛在的匹配和替換你可能不想要的東西的缺點。 Smarty的是這絕對矯枉過正,我會按照馬特的建議通過以上做這樣下面

function getEmailContents(array $vars) { 
    extract($vars); 

    ob_start(); 
    include 'email.html.php'; 
    return ob_get_clean(); 
} 

email.html.php東西看起來像這樣

<body> 
    Dear <?php echo $name; ?> <br/> 
    Thank you for your recent purhcase of <?php echo $product; ?> 
</body> 

,你可以這樣調用

$emailContents = getEmailContents(array('name' => 'El Yobo', 'product' => 'Something')); 

你永遠不會用這種方式錯誤地匹配任何東西,而且它很容易用其他變量等進行擴展,而無需使用str_replace()調用。

如果您需要進一步探索,可能值得一看Smarty。

+0

實際上這看起來確實是一種很好的方式。特別是在客戶購買許多產品的情況下,因爲我可以循環訪問html中的數組,而不是循環遍歷它,創建字符串,然後將其替換爲html文件。我沒有完全理解ob__start和ob_end_clean做什麼,它與輸出緩衝區有什麼關係? – cast01 2010-04-06 17:45:50

+0

好吧,我得到了那個工作,它的代碼更少!我不得不首先改變一些東西,'return ob_end_clean'好像只是返回1,所以在include之後,我添加了'$ html = ob_get_contents',然後我做了'ob_end_clean()',然後我返回'$ html' ,它的工作原理,這聽起來合理嗎?這樣做有什麼缺點嗎?它安全/高效嗎?非常感謝! – cast01 2010-04-06 18:07:43

+0

是的,使用ob_get_content()和ob_end_clean()很好。 ob_get_clean()的文檔表明這正是它在內部完成的任務(http://au.php.net/ob_get_clean)。 – 2010-04-06 22:26:56

1

如果你有很多的變量,你可能想看看現有的模板引擎(如Smarty)爲您完成這項工作。或者,PHP的str_replace()接受數組參數,並且在這方面非常強大 - 或者如果您需要確保您替換的任何內容不會被誤認爲是佔位符,則strtr()提供了該功能更昏昏沉沉)。

+1

感謝您的信息,我即將去與str替換:) – cast01 2010-04-06 12:46:13

3

你可以使用str_replace()函數定義的佔位符像

Dear %name 
Thank you for your recent purchase of %product 

,然後替換它們在飛行中:

$html = str_replace("%name", $order_name, $html); 
$product = str_replace("%product", $order_product, $html); 

使用file_get_contents()fopen()既是沒事。

+0

多數民衆贊成它!類似於我正在討論的內容,但在這種情況下,str_replace比正則表達式要好得多。 – cast01 2010-04-06 12:43:49

2

改爲使用PHP文件,並使用include它。沒有必要通過fgetsreplace讀取它。

ob_start(); 
include("yourTemplate.html.php"); 

$html = ob_get_clean(); 

// $html now has whatever your template output 
+0

工作過!我接受了El Yobo的版本,因爲它有一個更詳細的例子,不過謝謝! – cast01 2010-04-06 18:08:58

0

如果您期待未來還有更多功能,您可能需要考慮使用模板系統。