PHP项目邮件模板变量如何渲染替换

wen PHP项目 29

本文目录导读:

PHP项目邮件模板变量如何渲染替换

  1. 简单的字符串替换(适合简单场景)
  2. 使用正则表达式替换(更灵活)
  3. 使用PHP的 sprintf 格式(推荐)
  4. 使用 Twig 模板引擎(推荐用于复杂项目)
  5. 完整的邮件模板类
  6. 高级功能:支持条件判断和循环
  7. 最佳实践建议

在PHP项目中,邮件模板变量渲染替换是一个常见需求,以下是几种常用的实现方式:

简单的字符串替换(适合简单场景)

function renderEmailTemplate($template, $variables) {
    foreach ($variables as $key => $value) {
        $template = str_replace('{{' . $key . '}}', $value, $template);
    }
    return $template;
}
// 使用示例
$template = "尊敬的{{username}},您的验证码是:{{code}},有效期{{expire_time}}分钟。";
$variables = [
    'username' => '张三',
    'code' => '123456',
    'expire_time' => '5'
];
$emailContent = renderEmailTemplate($template, $variables);

使用正则表达式替换(更灵活)

function renderEmailTemplateRegex($template, $variables) {
    return preg_replace_callback('/\{\{(\w+)\}\}/', function($matches) use ($variables) {
        $key = $matches[1];
        return isset($variables[$key]) ? $variables[$key] : $matches[0];
    }, $template);
}

使用PHP的 sprintf 格式(推荐)

function renderEmailTemplateSprintf($template, $variables) {
    // 模板中使用 %s, %d 等格式
    $keys = array_keys($variables);
    $values = array_values($variables);
    // 替换模板中的变量名为占位符
    $search = array_map(function($key) {
        return '{' . $key . '}';
    }, $keys);
    $template = str_replace($search, $values, $template);
    return $template;
}
// 模板示例
$template = "尊敬的{username},您的订单号:{order_id},金额:{amount}元。";
$variables = [
    'username' => '李四',
    'order_id' => 'ORD2024123456',
    'amount' => '99.90'
];

使用 Twig 模板引擎(推荐用于复杂项目)

// 安装: composer require twig/twig
require_once 'vendor/autoload.php';
use Twig\Environment;
use Twig\Loader\ArrayLoader;
$loader = new ArrayLoader([
    'email_template' => "尊敬的{{ username }},您的验证码是:{{ code }}",
]);
$twig = new Environment($loader);
// 渲染模板
$emailContent = $twig->render('email_template', [
    'username' => '王五',
    'code' => '789012'
]);

完整的邮件模板类

class EmailTemplateRenderer {
    private $templateDir;
    private $cacheDir;
    public function __construct($templateDir, $cacheDir = null) {
        $this->templateDir = $templateDir;
        $this->cacheDir = $cacheDir;
    }
    /**
     * 渲染邮件模板
     * @param string $templateName 模板名称(不含扩展名)
     * @param array $variables 变量数据
     * @return string 渲染后的内容
     */
    public function render($templateName, array $variables = []) {
        $templateFile = $this->templateDir . '/' . $templateName . '.html';
        if (!file_exists($templateFile)) {
            throw new \Exception("模板文件不存在: {$templateFile}");
        }
        $template = file_get_contents($templateFile);
        return $this->parseTemplate($template, $variables);
    }
    /**
     * 解析模板变量
     */
    private function parseTemplate($template, $variables) {
        // 支持 {var} 和 {{var}} 两种语法
        $search = [];
        $replace = [];
        foreach ($variables as $key => $value) {
            $search[] = '{{' . $key . '}}';
            $search[] = '{' . $key . '}';
            // 对值进行HTML转义
            if (is_string($value)) {
                $value = htmlspecialchars($value, ENT_QUOTES, 'UTF-8');
            }
            $replace[] = $value;
            $replace[] = $value;
        }
        return str_replace($search, $replace, $template);
    }
}
// 使用示例
$renderer = new EmailTemplateRenderer(__DIR__ . '/templates');
$emailContent = $renderer->render('welcome_email', [
    'username' => '赵六',
    'site_name' => '我的网站',
    'year' => date('Y')
]);

高级功能:支持条件判断和循环

class AdvancedEmailRenderer {
    /**
     * 支持简单的条件判断和循环
     */
    public function render($template, $variables) {
        // 处理条件判断 {if var}...{/if}
        $template = preg_replace_callback('/\{if\s+(\w+)\}(.*?)\{\/if\}/s', 
            function($matches) use ($variables) {
                $var = $matches[1];
                $content = $matches[2];
                return !empty($variables[$var]) ? $content : '';
            }, 
            $template
        );
        // 处理循环 {foreach var}...{/foreach}
        $template = preg_replace_callback('/\{foreach\s+(\w+)\}(.*?)\{\/foreach\}/s',
            function($matches) use ($variables) {
                $var = $matches[1];
                $content = $matches[2];
                $result = '';
                if (isset($variables[$var]) && is_array($variables[$var])) {
                    foreach ($variables[$var] as $item) {
                        $itemContent = $content;
                        foreach ($item as $key => $value) {
                            $itemContent = str_replace('{' . $key . '}', $value, $itemContent);
                        }
                        $result .= $itemContent;
                    }
                }
                return $result;
            },
            $template
        );
        // 最终替换变量
        return $this->replaceVariables($template, $variables);
    }
    private function replaceVariables($template, $variables) {
        foreach ($variables as $key => $value) {
            if (is_string($value)) {
                $template = str_replace('{' . $key . '}', $value, $template);
            }
        }
        return $template;
    }
}

最佳实践建议

  1. 安全性:对变量值进行HTML转义,防止XSS攻击
  2. 性能:使用缓存机制,避免重复读取模板文件
  3. 可维护性:将模板文件与PHP代码分离
  4. 灵活性:支持嵌套变量和条件逻辑

选择哪种方式取决于你的项目复杂度和需求,小型项目使用简单的字符串替换即可,大型项目建议使用专门的模板引擎。

抱歉,评论功能暂时关闭!