我有一个实体,其文本类型属性称为contactInfo
。在表单中输入这些详细信息时,用户只能提交不带html的文本。通常,在此文本区域中的某处输入电子邮件地址(以及更多详细信息)。
现在,当我显示此contactInfo
时,我想将任何电子邮件地址调整为带有mailto超链接的电子邮件地址。例如
Email us at: example@email.com.
应成为:
Email us at: <a href="mailto:example@email.com">example@email.com</a>.
该如何处理?我可以使用某些RegEx或Replace过滤器直接在Twig中执行此操作吗?还是我应该在控制器中真正做到这一点?
答案 0 :(得分:2)
您可以创建一个树枝过滤器,例如“ mailTo” 并做类似
<?php
namespace App\Twig;
use Twig\Extension\AbstractExtension;
use Twig\TwigFilter;
class AppExtension extends AbstractExtension
{
public function getFilters()
{
return array(
new TwigFilter('mailTo', array($this, 'mailTo'), array('is_safe' => 'html')),
);
}
public function mailTo(string $text)
{
if(preg_match_all('/[\p{L}0-9_.-]+@[0-9\p{L}.-]+\.[a-z.]{2,6}\b/u',$text,$mails)){
foreach($mails[0]as $mail ){
$text = str_replace($mail,'<a href="mailto:'.$mail.'">'.$mail.'<a>',$text);
}
}
return $text;
}
}
然后在模板中像这样使用它
contactInfo|mailTo
无论哪种方式,当它们总是相同时,不要在数据库中存储“ mailto:”或html标记...
有关树枝定制过滤器的文档 https://symfony.com/doc/current/templating/twig_extension.html