本文目录导读:

- 简单的字符串替换(适合简单场景)
- 使用正则表达式替换(更灵活)
- 使用PHP的
sprintf格式(推荐) - 使用 Twig 模板引擎(推荐用于复杂项目)
- 完整的邮件模板类
- 高级功能:支持条件判断和循环
- 最佳实践建议
在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;
}
}
最佳实践建议
- 安全性:对变量值进行HTML转义,防止XSS攻击
- 性能:使用缓存机制,避免重复读取模板文件
- 可维护性:将模板文件与PHP代码分离
- 灵活性:支持嵌套变量和条件逻辑
选择哪种方式取决于你的项目复杂度和需求,小型项目使用简单的字符串替换即可,大型项目建议使用专门的模板引擎。