У меня есть объект с атрибутом текстового типа под названием contactInfo. Пользователи могут отправлять текст без HTML только при вводе этих данных в форму. Часто адрес электронной почты вводится где-то в этом текстовом поле (вместе с более подробной информацией).
Теперь, когда я показываю этот contactInfo, я хотел бы преобразовать любой адрес электронной почты в адрес электронной почты с гиперссылкой mailto. Например
Email us at: [email protected].
должно стать:
Email us at: <a href = "mailto:[email protected]">[email protected]</a>.
Как это сделать? Могу ли я сделать это прямо в Twig с каким-нибудь фильтром RegEx или Replace? Или мне действительно стоит это сделать в контроллере?






Вы можете создать фильтр веток, например "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 в базе данных, если они всегда будут одинаковыми ...
документация по пользовательским фильтрам twig https://symfony.com/doc/current/templating/twig_extension.html
Как заявил OP Users can only submit text without html
Но им не нужно ... это не то, как работает фильтр веток, он может динамически добавлять теги html и отображать их с помощью необработанного фильтра
Конечный пользователь OP не будет знать ни о каких переменных, поэтому он / она будет вынужден ввести что-то вроде bla bla bla mail me at {{ '[email protected]' | mailTo }}. Не очень удобно
Фильтр применяется ко всему текстовому блоку. Я протестировал его с помощью предложения вроде «мои письма - [email protected], [email protected] и т. д. И т. Д. И т. Д.», И он работает нормально ... preg_match_all может получать любую электронную почту, и вы можете повторять и заменять eah со ссылкой html, тогда вы. результат рендерится с необработанным фильтром, поэтому теги HTMl не экранируются. Вы должны хотя бы попробовать
Эта новая отредактированная версия на самом деле неплохая! Единственное, что нужно изменить, - это регулярное выражение, потому что некоторые адреса электронной почты заканчиваются двойным расширением ([email protected]).
Хорошо, если OP сначала удаляет весь html перед применением raw, тогда да. Вы также можете пометить фильтр как безопасный, например new TwigFilter('mailTo', array($this, 'mailTo'), array('is_safe' => 'html'));
@Dirk J. Faber, если у вас есть лучшее регулярное выражение, я могу добавить его, это первое, что я нашел для примера, но, как вы говорите, он не идеален
Если бы я был вами, я бы скорректировал ввод уже до того, как сохранить его в базе данных, иначе вы могли бы сделать это, создав свой собственный класс шаблона.