2017-10-04 120 views
0

我的問題基本上是否我嘗試做甚至可能。我要麼做的不對,要麼我做的太大了......(插入不專業的php設計師免責聲明)。使用str_replace()(全部包含在函數中)調用PHP函數的替代方法(或正確方法)是什麼?

我正在創建一個自動發送電子郵件系統。我將電子郵件的佈局存儲在文本文件中。我希望被動態編寫的信息由我所稱的標籤(即[DATE],[CUSTNAME],[MESSAGE] ...)表示。

當創建併發送電子郵件時,變量會從我的索引頁傳遞給一個函數,我只是簡單地包含文本文件,而用動態內容替換我的標籤。這對我來說非常合適,直到我想加強通訊中的內容爲止。現在我想添加一個從獨立函數調用的部分。這導致我的電子郵件功能實際上顯示來自被調用函數的內容3次,而不是完成拍攝電子郵件和根據需要重定向的功能。

我的代碼(包含一個函數內)更新(爲我工作)之前:在更新後

$EmailBodyTEXT = addslashes($EmailBody); 
$EmailBody = 
str_replace('[YEAR]', date(Y), 
str_replace('[SUBJECT]', $EmailSubject, 
str_replace('[DATE]', date('l, F j, Y'), 
str_replace('[MESSAGE]', $EmailBody, file_get_contents($url . 'newsletter_BLANK.txt'))))); 

我的代碼(失敗):

$EmailBodyTEXT = addslashes($EmailBody); 
$EmailBody = 
str_replace('[YEAR]', date(Y), 
str_replace('[SUBJECT]', $EmailSubject, 
str_replace('[DATE]', date('l, F j, Y'), 
str_replace('[MESSAGE]', $EmailBody, 
str_replace('[PHOTOSTREAM]', PhotoStream(CUST), file_get_contents($url . 'newsletter_BLANK.txt')))))); 

對於什麼是值得的,我試過將'第二個函數'加載到$變量中,並將該函數調用替換爲完全相同的結果,如我所料。

我應該如何調用這個函數來當場不「執行」,而是繼續執行包含函數的過程,該過程會在創建和交付過程中將這些內容傳遞到電子郵件中?我只是不正確的想法有一種方法來從str_replace進程加載函數?有沒有更明顯的方式來嘗試做到這一點(基本上是一個郵件合併)功能?

請讓我知道你的想法,如果我需要更多的代碼。

這裏是照片流():

function PhotoStream($DispTo) { 
global $url, $uri, $urp, $locurl; 

if(empty($DispTo)) { echo 'unconfigured'; continue; } else { 

if($DispTo == 'CUST') { $DispTo = urlencode('$redacted'); } else { $DispTo = '$redacted'; } 

} 

if($getPics = mysql_query("SELECT pid, px, title FROM photos ORDER BY pubdate DESC LIMIT 6")) { 

echo '<fieldset><div id="wrapNL">'; 

while($gPics = mysql_fetch_array($getPics)) { 

$pid = $gPics{'pid'}; 
$pex = $gPics{'px'}; 
$ptl = $gPics{'title'}; 

echo '<div id="pthumbs"><a href="' . $uri . $DispTo . '&PID=' . $pid . $locurl . '">'; 
echo '<img src="' . $urp . 'uploads/' . $pid . '.' . $pex . '" alt="' . $ptl . '" title="' . $ptl . '">'; 
echo '</a></div>'; 

} 

echo '</div></fieldset>'; 

} 

} 
+0

你的PhotoStream功能是做什麼的?它迴應什麼,或返回? – rickdenhaan

+0

您只需將數組傳遞給'str_replace'的第一個和第二個參數,而不是鏈接'str_replace'調用。例如:'str_replace(array('[YEAR]','[SUBJECT]'),數組(日期('Y'),$ EmailSubject),$ EmailBody)''。 – ccKep

+0

我添加了PhotoStream()。它確實回聲。 – BJC

回答

1

我覺得你這個過於複雜。

如果要替換字符串中的多個線索,您可以使用strtr函數。它有兩個參數,第一個是用來替換valies的字符串,第二個是代表替換的鍵的關聯數組,並且其值代表替換它們的值。

嘗試類似如下的內容:

<?php 

$emailBody = strtr($emailBodyRaw, array(
    '[TOKEN]' => 'token value', 
    '[ANOTHER]' => 'another value', 
    //More replacements here 
)); 

你更復雜的可以替代這個片段之外完成,取代的作爲單個變量。


編輯:您將要更新您的照片流功能返回一個值,而不是藏漢呼應它。您可以隨時呼應,如果需要在其他地方你的應用程序中什麼返回


編輯2:捕獲照片流回聲輸出變量

使用被稱爲輸出緩衝的方法,你可以用你的照片流功能其目前做類似以下內容的狀態:

<?php 

ob_start(); 
PhotoStream($DispTo) 
$photo = ob_get_clean(); 
ob_end_clean() 

$emailBody = strtr($emailBodyRaw, array(
    '[PHOTO]' => $photo 
    //More replacements here 
)); 

這樣做,你拍攝什麼照片流回聲的,並將其存儲在一個變量。

要直接在替換數組中使用該函數,您將不得不重構它以返回html而不是回顯它。

+0

我想你可能是對的......但是我能否用=> aFunction()代替[ATAG]? – BJC

+0

只要你從你的函數返回一個值,而不是回顯出來,這樣就可以正常工作。 – JParkinson1991

+0

已更新我的回答,以顯示如何捕獲PhotoStream功能的回波輸出並將其用作替代品。希望有所幫助! – JParkinson1991

相關問題