¿La forma más sencilla de convertir una URL en un hipervínculo en una cadena de C#?

StackOverflow https://stackoverflow.com/questions/32637

  •  09-06-2019
  •  | 
  •  

Pregunta

Estoy consumiendo la API de Twitter y quiero convertir todas las URL en hipervínculos.

¿Cuál es la forma más eficaz que se te ha ocurrido para hacer esto?

de

string myString = "This is my tweet check it out http://tinyurl.com/blah";

a

This is my tweet check it out <a href="http://tinyurl.com/blah">http://tinyurl.com/>blah</a>
¿Fue útil?

Solución

Las expresiones regulares probablemente sean tus amigas para este tipo de tareas:

Regex r = new Regex(@"(https?://[^\s]+)");
myString = r.Replace(myString, "<a href=\"$1\">$1</a>");

La expresión regular para URL coincidentes puede necesitar un poco de trabajo.

Otros consejos

Hice exactamente lo mismo con jquery consumiendo la API JSON aquí está la función linkify:

String.prototype.linkify = function() {
    return this.replace(/[A-Za-z]+:\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_:%&\?\/.=]+/, function(m) {
        return m.link(m);
    });
 };

En realidad, este es un problema desagradable.Las URL pueden contener (y terminar con) puntuación, por lo que puede resultar difícil determinar dónde termina realmente una URL cuando está incrustada en texto normal.Por ejemplo:

http://example.com/.

es una URL válida, pero también podría ser el final de una oración:

I buy all my witty T-shirts from http://example.com/.

No puedes simplemente analizar hasta encontrar un espacio, porque entonces mantendrás el punto como parte de la URL.Tampoco puedes simplemente analizar hasta encontrar un punto o un espacio, porque los puntos son extremadamente comunes en las URL.

Sí, la expresión regular es tu amiga aquí, pero construir la expresión regular adecuada es la parte difícil.

Mira esto también: Ampliar URL con Regex en .NET.

Puede agregar más control sobre esto usando la función delegada MatchEvaluator con expresión regular:supongamos que tengo esta cadena:

find more on http://www.stackoverflow.com 

ahora prueba este código

private void ModifyString()
{
    string input = "find more on http://www.authorcode.com ";
                Regex regx = new Regex(@"\b((http|https|ftp|mailto)://)?(www.)+[\w-]+(/[\w- ./?%&=]*)?");
                string result = regx.Replace(input, new MatchEvaluator(ReplaceURl));
}

static string ReplaceURl(Match m)
{
    string x = m.ToString();
    x = "< a href=\"" + x + "\">" + x + "</a>";
    return x;
}

/aplausos para los Lobos Rojos

de:this.replace(/[A-Za-z]+://[A-Za-z0-9-]+.[A-Za-z0-9-:%&\?/.=]+/, función(m){...

ver:/[A-Za-z]+://[A-Za-z0-9-]+.[A-Za-z0-9-:%&\?/.=]+/

Ahí está el código para las direcciones "cualquier protocolo"://"cualquier subdominio/dominio"."cualquier extensión de dominio y dirección",

y es un ejemplo perfecto para otros usos de la manipulación de cadenas.puede cortar y cortar en dados a voluntad con .replace e insertar "a href" adecuados donde sea necesario.

Utilicé jQuery para cambiar los atributos de estos enlaces a "target=_blank" fácilmente en mi lógica de carga de contenido, aunque el método .link no te permite personalizarlos.

Personalmente, me encanta agregar un método personalizado al objeto de cadena para el filtrado de cadenas sobre la marcha (la declaración String.prototype.linkify), pero no estoy seguro de cómo se desarrollaría eso en un entorno a gran escala en el que Tienes que organizar más de 10 funciones personalizadas similares a Linkify.Creo que definitivamente tendrías que hacer algo más con la estructura de tu código en ese momento.

Quizás algún veterinario se tropiece por aquí y nos ilumine.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top