本文目录导读:

- 简单的字符串替换(适合简单场景)
- 使用正则表达式替换(更灵活)
- 使用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代码分离
- 灵活性:支持嵌套变量和条件逻辑
选择哪种方式取决于你的项目复杂度和需求,小型项目使用简单的字符串替换即可,大型项目建议使用专门的模板引擎。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播