2012-04-11 200 views
2

我有一个函数发出站点电子邮件(使用phpmailer),我想要做的事情基本上是用php来替换email.tpl文件中的所有placheholder与我提供的内容。对我来说,问题是我不想重复代码,因此我创建了一个函数(见下文)。用PHP替换多个占位符?

没有一个PHP函数,我会做一个脚本

// email template file 
$email_template = "email.tpl"; 

// Get contact form template from file 
$message = file_get_contents($email_template); 

// Replace place holders in email template 
$message = str_replace("[{USERNAME}]", $username, $message); 
$message = str_replace("[{EMAIL}]", $email, $message); 

现在我知道该怎么做休息下,但我粘在str_replace(),如上图所示,我有多个str_replace()功能,以取代电子邮件模板中的占位符。我想是的str_replace()添加到我的功能(如下图),并把它找到[\]所有实例电子邮件模板,我给它,并用占位符值替换它,我会给这样的:str_replace("[\]", 'replace_with', $email_body)

问题是我不知道如何将多个占位符和它们的替换值传入我的函数,并获得str_replace("[{\}]", 'replace_with', $email_body)来处理我给它的所有占位符,并用相应的值替换。

因为我想在多个地方使用该功能并避免重复代码,所以在某些脚本上,我可能会传递函数5个占位符,并且值和另一个脚本可能需要传递10个占位符,并将值传递给要使用的函数在电子邮件模板。

我不确定是否需要在脚本中使用一个数组,该函数将使用该函数并在函数中使用for循环,以便让我的php函数获得xx占位符和xx值从一个脚本,并通过占位符循环,并取代它们的值。

这是我上面提到的功能。我评论了这个脚本,这可能更容易解释。

// WILL NEED TO PASS PERHAPS AN ARRAY OF MY PLACEHOLDERS AND THERE VALUES FROM x SCRIPT 
// INTO THE FUNCTION ? 
function phpmailer($to_email, $email_subject, $email_body, $email_tpl) { 

// include php mailer class 
require_once("class.phpmailer.php"); 

// send to email (receipent) 
global $to_email; 
// add the body for mail 
global $email_subject; 
// email message body 
global $email_body; 
// email template 
global $email_tpl; 

// get email template 
$message = file_get_contents($email_tpl); 

// replace email template placeholders with content from x script 
// FIND ALL INSTANCES OF [{}] IN EMAIL TEMPLATE THAT I FEED THE FUNCTION 
// WITH AND REPLACE IT WITH THERE CORRESPOING VALUES. 
// NOT SURE IF I NEED A FOR LOOP HERE PERHAPS TO LOOP THROUGH ALL 
// PLACEHOLDERS I FEED THE FUNCTION WITH AND REPLACE WITH THERE CORRESPONDING VALUES 
$email_body  = str_replace("[{\}]", 'replace', $email_body); 

// create object of PHPMailer 
$mail = new PHPMailer(); 

// inform class to use smtp 
$mail->IsSMTP(); 
// enable smtp authentication 
$mail->SMTPAuth = SMTP_AUTH; 
// host of the smtp server 
$mail->Host  = SMTP_HOST; 
// port of the smtp server 
$mail->Port  = SMTP_PORT; 
// smtp user name 
$mail->Username = SMTP_USER; 
// smtp user password 
$mail->Password = SMTP_PASS; 
// mail charset 
$mail->CharSet = MAIL_CHARSET; 

// set from email address 
$mail->SetFrom(FROM_EMAIL); 
// to address 
$mail->AddAddress($to_email); 
// email subject 
$mail->Subject = $email_subject; 
// html message body 
$mail->MsgHTML($email_body); 
// plain text message body (no html) 
$mail->AltBody(strip_tags($email_body)); 

// finally send the mail 
if(!$mail->Send()) { 
    echo "Mailer Error: " . $mail->ErrorInfo; 
    } else { 
    echo "Message sent Successfully!"; 
    } 
} 

回答

13

简单,看strtr­Docs

$vars = array(
    "[{USERNAME}]" => $username, 
    "[{EMAIL}]" => $email, 
); 

$message = strtr($message, $vars); 

添加尽可能多(或更少)的更换,对,只要你喜欢。但我建议,你处理模板调用phpmailer函数之前,这样的事情是保持分开:模板和电子邮件发送:

class MessageTemplateFile 
{ 
    /** 
    * @var string 
    */ 
    private $file; 
    /** 
    * @var string[] varname => string value 
    */ 
    private $vars; 

    public function __construct($file, array $vars = array()) 
    { 
     $this->file = (string)$file; 
     $this->setVars($vars); 
    } 

    public function setVars(array $vars) 
    { 
     $this->vars = $vars; 
    } 

    public function getTemplateText() 
    { 
     return file_get_contents($this->file); 
    } 

    public function __toString() 
    { 
     return strtr($this->getTemplateText(), $this->getReplacementPairs()); 
    } 

    private function getReplacementPairs() 
    { 
     $pairs = array(); 
     foreach ($this->vars as $name => $value) 
     { 
      $key = sprintf('[{%s}]', strtoupper($name)); 
      $pairs[$key] = (string)$value; 
     } 
     return $pairs; 
    } 
} 

的使用可大大简化的话,你可以将整个模板传递给任何函数需要字符串输入。

$vars = compact('username', 'message'); 
$message = new MessageTemplateFile('email.tpl', $vars); 
+0

非常感谢你,第一位代码向我解释了这一切,你所做的这个类非常感谢,但是我还没有学会oop,所以会给它一个错误,但是第一个样例很适合我需要的谢谢,非常感谢! :) – PHPLOVER 2012-04-11 13:35:37

+1

@PHPLover:那么请参阅以及[类似的电子邮件模板问题和答案](http://stackoverflow.com/q/8176804/367456)和[用变量替换占位符的有效方法](http:/ /stackoverflow.com/q/7980741/367456)。 – hakre 2012-04-11 13:56:12

0

为什么不把电子邮件模板做成php文件呢?然后你可以这样做:

Hello <?=$name?>, my name is <?=$your_name?>, today is <?=$date?> 

里面的电子邮件生成您的HTML,然后发送结果作为电子邮件。

对我来说,似乎你喜欢你这么辛苦吗?

+0

因为它可能会引入代码注入漏洞?顺便说一句短标签已弃用 – symcbean 2012-04-11 12:53:42

+0

如果你用$ y替换“X”,那么它的结果与用$ y替换$ x的结果是一样的 - 所以没有新的代码注入漏洞? – Laurence 2012-04-11 13:57:09

+0

你是在说服模板的控制方式与php代码 – symcbean 2012-04-11 16:27:12