Электронный адрес в тексте для гиперссылки mailto (возможно в Twig?)

У меня есть объект с атрибутом текстового типа под названием contactInfo. Пользователи могут отправлять текст без HTML только при вводе этих данных в форму. Часто адрес электронной почты вводится где-то в этом текстовом поле (вместе с более подробной информацией).

Теперь, когда я показываю этот contactInfo, я хотел бы преобразовать любой адрес электронной почты в адрес электронной почты с гиперссылкой mailto. Например

Email us at: [email protected]. 

должно стать:

Email us at: <a href = "mailto:[email protected]">[email protected]</a>.

Как это сделать? Могу ли я сделать это прямо в Twig с каким-нибудь фильтром RegEx или Replace? Или мне действительно стоит это сделать в контроллере?

Если бы я был вами, я бы скорректировал ввод уже до того, как сохранить его в базе данных, иначе вы могли бы сделать это, создав свой собственный класс шаблона.

DarkBee 22.11.2018 13:46
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
1
1 414
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете создать фильтр веток, например "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

DarkBee 22.11.2018 14:41

Но им не нужно ... это не то, как работает фильтр веток, он может динамически добавлять теги html и отображать их с помощью необработанного фильтра

Yoann MIR 22.11.2018 16:44

Конечный пользователь OP не будет знать ни о каких переменных, поэтому он / она будет вынужден ввести что-то вроде bla bla bla mail me at {{ '[email protected]' | mailTo }}. Не очень удобно

DarkBee 22.11.2018 18:52

Фильтр применяется ко всему текстовому блоку. Я протестировал его с помощью предложения вроде «мои письма - [email protected], [email protected] и т. д. И т. Д. И т. Д.», И он работает нормально ... preg_match_all может получать любую электронную почту, и вы можете повторять и заменять eah со ссылкой html, тогда вы. результат рендерится с необработанным фильтром, поэтому теги HTMl не экранируются. Вы должны хотя бы попробовать

Yoann MIR 22.11.2018 20:52

Эта новая отредактированная версия на самом деле неплохая! Единственное, что нужно изменить, - это регулярное выражение, потому что некоторые адреса электронной почты заканчиваются двойным расширением ([email protected]).

Dirk J. Faber 22.11.2018 21:05

Хорошо, если OP сначала удаляет весь html перед применением raw, тогда да. Вы также можете пометить фильтр как безопасный, например new TwigFilter('mailTo', array($this, 'mailTo'), array('is_safe' => 'html'));

DarkBee 22.11.2018 21:22

@Dirk J. Faber, если у вас есть лучшее регулярное выражение, я могу добавить его, это первое, что я нашел для примера, но, как вы говорите, он не идеален

Yoann MIR 23.11.2018 09:25

Другие вопросы по теме