2

这更像是一个“最佳实践”问题。

我有一些电子邮件模板,其中有几个我需要查找和替换的标签。

例如:

Dear [[customername]],
Blah blah blah blah, and more blah.

Your Invoice....
----------------------------------------------------------
Order Status: [[orderstatus]]
Order Number: [[orderid]]
Date Ordered: [[dateordered]]
Payment Method: [[paymentmethod]]
Billing Statement: [[billingstatement]]

无论如何,我在双括号内有几个这样的标签。所以我使用一个简单的: $text = str_replace($oldWord , $newWord , $text);

我确信这是执行此操作的正常方式,但我只是好奇是否有人有不同的想法。否则,我会坚持我正在做的事情。

4

7 回答 7

4

您可以使用带有 str_replace 的数组:

$oldWords = array('[[customername]]',
                  '[[orderstatus]]'
                 );
$newWords = array($customerName,
                  $orderStatus
                 );

$newText = str_replace($oldWords , $newWords , $text); 

您还可以将 preg_replace 与数组一起使用

$oldWords = array('/\[\[customername\]\]/',
                  '/\[\[orderstatus\]\]/'
                 );
$newWords = array($customerName,
                  $orderStatus
                 );

$newText = preg_replace($oldWords , $newWords , $text); 
于 2011-02-14T16:38:49.750 回答
1

从您的示例中我无法确定,但如果 $oldWord 和 $newWord 是字符串(如其名称所示),那么您的做法不对。str_replace 接受数组参数,因此您可以一次完成所有替换:

$text = str_replace($oldValues, $newValues, $text);

其中 $oldValues = array('[[customername]]', [[orderstatus]], ...)

和 $newValues = array('John Smith', 'approved', ...)

于 2011-02-14T16:40:47.080 回答
0

正如你所说,这没有对错,我通常会命名:

_customername_

没有特别的原因:)

于 2011-02-14T16:37:21.733 回答
0

您可以将数组与 str_replace 一起使用

于 2011-02-14T16:37:45.693 回答
0

我会说,如果您的代码按照您的操作方式格式正确,则可以,因为这是最快的方法。

您也可以使用两个数组而不是两个字符串来传递给 str_replace,但我认为这不太可读。

于 2011-02-14T16:37:53.777 回答
0

您可以使用词法分析器编写自己的扩展。例如,有关编写 php 扩展的教程,请访问http://devzone.zend.com/article/1021

于 2011-02-14T16:43:43.490 回答
0

我个人会像这样创建一个小模板类:

class EmailTemplate
{
    private $_template = '';

    public function __construct($template)
    {
        $this->_template = $template;
    }

    public function __set($key,$value)
    {
        $this->_template = str_replace("[[" . $key . "]]",$value,$this->_template);
    }

    public function __toString()
    {
        return $this->_template;
    }
}

简单的用法是这样的:

$temp = file_get_contents("email/templates/invoice.template");

$Template = new EmailTemplate($temp);

$Template->customername = "John Doe";
$Template->orderstatus = "On Route";
$Template->orderid = 14875356;
$Template->dateordered = date();
$Template->paymentmethod = "VISA (DD)";
$Template->billingstatement = "blah";

echo $Template; // = Happy.
于 2011-02-14T16:47:08.777 回答