Создание HTML-ссылок из текстовых адресов с использованием Html Agility Pack

c# html-agility-pack

Вопрос

Как преобразовать ссылку url в html из текста с помощью Html Agility Pack + c #?

Например: «www.stackoverflow.com - очень классный сайт».

Вывод:

"<a href="www.stackoverflow.com">www.stackoverflow.com</a>  is a very cool site."

Принятый ответ

Спасибо @ user1778606 за ваш ответ. Я получил эту работу, хотя она все еще использует немного Regex. Он работает намного лучше и безопаснее (т. Е. Он никогда не будет создавать гиперссылки в гиперссылках и атрибут href).

        //convert text to html
        HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
        doc.LoadHtml(inputString);

        // \w* - means it can start with any alphanumeric charactar
        // \s+ - was placed to replace all white spaces (when there is more than one word).
        // \b - set bounderies for the keyword
        const string pattern = @"((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[.\!\/\\w]*))?)";

        //get all elements text propery except for anchor element 
        var nodes = doc.DocumentNode.SelectNodes("//text()[not(ancestor::a)]") ?? new HtmlAgilityPack.HtmlNodeCollection(null);

        foreach (var node in nodes)
        {
            Regex regex = new Regex(pattern, RegexOptions.IgnoreCase);
            node.InnerHtml = regex.Replace(node.InnerHtml, "<a href=\"$1\">$1</a>").Replace("href=\"www", "href=\"http://www");
        }

        return doc.DocumentNode.OuterHtml;

Популярные ответы

Я почти уверен, что это возможно, хотя я этого не делал.

Вот как заменить фиксированную строку в документе ссылками

Найти ключевое слово в тексте, когда ключевое слово соответствует определенным условиям - C #

Представляет, как регулярное выражение для URL-адресов

регулярное выражение для URL-адреса

Поместите их вместе, и это должно быть возможно.

ПСЕВДОКОД

выбрать все текстовые узлы

для каждого узла

получить внутренний текст
найти URL-адреса в тексте (использовать регулярное выражение?)
для каждого найденного URL

замените текст URL-адресом строковым литеральным тегом ссылки (a href = etc ...)



Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow