使用 str_replace() (全部包含在函数中)调用 PHP 函数的替代方法(或正确方法)是什么?

What is an alternative (or the correct way) of calling a PHP function from with a str_replace() (All contained within a function)?

我的问题基本上是我想做的事情是否可行。我要么做错了什么,要么我的梦想太大了……(在这里插入不专业的 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'))))));

为了它的价值,我尝试 'load' $变量中的第二个函数并将函数调用替换为变量,结果与我预期的完全相同。

我应该如何调用此函数而不是当场 'execute',而是继续包含函数的过程,该函数会在创建和传递过程中将此内容传递到电子邮件中?我认为有一种方法可以从 str_replace 进程加载函数,我是不是完全不正确?是否有更明显的方法来尝试执行此操作(基本上是邮件合并)功能?

如果需要我提供更多代码,请告诉我您的想法。

这是 PhotoStream():

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>';

}

}

我认为你过于复杂了。

如果您想替换一个字符串中的多个值,您可以使用 strtr 函数。它有两个参数,第一个是要将值替换成的字符串,第二个是表示替换的关联键数组,还有表示要替换它们的值的值。

尝试类似于以下的操作:

<?php

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

您可以在此代码段之外完成更复杂的替换,并将其替换为单个变量。


编辑:您需要将您的 PhotoStream 函数更新为 return 一个值而不是回显它。如果您的应用程序中的其他地方需要,您可以随时回显 returned


编辑 2:在变量中捕获 PhotoStream 回显输出

使用一种称为输出缓冲的方法,您可以通过执行类似于以下的操作在其当前状态下使用您的 PhotoStream 函数:

<?php

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

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

这样做您可以捕获 PhotoStream 回声并将其存储在一个变量中。

要直接在替换数组中使用该函数,您必须将其重构为 return 和 html 而不是回显它。