Crea collegamenti Html da URL in-text utilizzando Html Agility Pack

c# html-agility-pack

Domanda

Come posso convertire un URL in link html da testo usando Html Agility Pack + c #?

Ad esempio: "www.stackoverflow.com è un sito molto interessante."

Produzione:

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

Risposta accettata

Grazie @ user1778606 per la tua risposta. Ho funzionato anche se utilizza ancora un po 'di Regex. Funziona molto meglio e più sicuro (cioè non creerà mai collegamenti ipertestuali all'interno di collegamenti ipertestuali e l'attributo 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;

Risposta popolare

Sono abbastanza sicuro che sia possibile, anche se non l'ho mai provato.

Ecco come sostituire una stringa fissa in un documento con collegamenti

Trova parole chiave nel testo quando la parola chiave corrisponde a determinate condizioni - C #

Ecco come regex per gli URL

espressione regolare per url

Mettili insieme e dovrebbe essere possibile.

pseudocodice

seleziona tutti i nodi di testo

per ogni nodo

prendi il testo interno
trova gli URL nel testo (usa regex?)
per ogni URL trovato

sostituisci il testo dell'url con il tag letteral link string (a href = etc ...)



Related

Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché