2017-10-04 122 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

相关问题