我创建了一个电子邮件模板,我希望能够使用 [NAME]、[EMAIL]、[PHONE] 等内容,并在发送时替换它们。这些很简单,但我还有其他更复杂的标签,如 [PRODUCT:12]、[ARTICLE:23] 等,我想在第一部分中读取“类型”,然后将第二部分作为值处理。
我猜我需要某种 preg_match 然后 preg_replace,但我真的很茫然,因为我不擅长这些功能。
有什么建议么?
- -编辑 - -
只是要清楚。问题在于两部分括号中的 var:value 对。我需要能够看到它是 PRODUCT 并查找返回产品的 id=12 以便我可以建立链接。
---编辑2---
public function parse_message_tags($matches){
$keys = explode(':', $matches[1]);
$key = $keys[0];
$id = (array_key_exists(1, $keys)) ? $keys[1] : -1;
switch ($key) {
case 'NAME':
return $this->session->member->name();
break;
case 'FIRST_NAME':
return $this->session->member->first_name;
break;
case 'EMAIL':
return $this->session->member->email;
break;
case 'PRODUCT':
$product = Product::find_by_id($id);
return '<a href="/products/'.$product->seo_name.'">'.$product->name.'</a>';
break;
case 'ARTICLE':
$product = Article::find_by_id($id);
return '<a href="/blog/'.$article->seo_title.'">'.$article->name.'</a>';
break;
}
}
public function parse_message($input)
{
$pattern = '/\[(NAME|FIRST_NAME|EMAIL|PHONE|PRODUCT:\d+|ARTICLE:\d+)\]/';
return preg_replace_callback($pattern, create_function('$matches', 'return self::parse_message_tags;'), $input);
}
结果:
致命错误:当没有类范围处于活动状态时无法访问 self::
或者
致命错误:不在对象上下文中使用 $this
我猜 create_function() 会将您带出范围/上下文。显然我在这里使用类方法,所以简单地调用“parse_message_tags”不是一种选择。