Cree enlaces HTML a partir de direcciones URL en el texto usando Html Agility Pack

c# html-agility-pack

Pregunta

¿Cómo puedo convertir una url a un enlace html del texto usando Html Agility Pack + c #?

Por ejemplo: "www.stackoverflow.com es un sitio muy bueno".

Salida:

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

Respuesta aceptada

Gracias @ usuario1778606 por tu respuesta. Conseguí este trabajo aunque todavía usa un poco de Regex. Funciona mucho mejor y es más seguro (es decir, nunca creará hipervínculos dentro de los hipervínculos y el atributo 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;

Respuesta popular

Estoy bastante seguro de que es posible, aunque no lo he intentado.

Aquí es cómo reemplazar una cadena fija en un documento con enlaces

Encuentre palabras clave en el texto cuando las palabras clave coincidan con ciertas condiciones - C #

Heres cómo regex para urls

expresión regular para url

Ponlos juntos y debería ser posible.

Pseudocódigo

seleccionar todos los nodos de texto

para cada nodo

obtener el texto interior
encontrar urls en el texto (usar regex?)
por cada url encontrado

reemplace el texto de la url con una cadena de enlace literal (a href = etc ...)



Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué