Il modo più semplice per convertire un URL in un collegamento ipertestuale in una stringa C#?

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

  •  09-06-2019
  •  | 
  •  

Domanda

Sto utilizzando l'API di Twitter e desidero convertire tutti gli URL in collegamenti ipertestuali.

Qual è il modo più efficace che hai trovato per farlo?

da

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>
È stato utile?

Soluzione

Le espressioni regolari sono probabilmente tue amiche per questo tipo di attività:

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

L'espressione regolare per la corrispondenza degli URL potrebbe richiedere un po' di lavoro.

Altri suggerimenti

Ho fatto esattamente la stessa cosa con jquery che utilizza l'API JSON ecco la funzione 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);
    });
 };

Questo è in realtà un brutto problema.Gli URL possono contenere (e terminare con) segni di punteggiatura, quindi può essere difficile determinare dove termina effettivamente un URL quando è incorporato nel testo normale.Per esempio:

http://example.com/.

è un URL valido, ma potrebbe facilmente essere la fine di una frase:

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

Non puoi semplicemente analizzare finché non viene trovato uno spazio, perché in questo caso manterrai il punto come parte dell'URL.Inoltre, non puoi semplicemente analizzare fino a quando non viene trovato un punto o uno spazio, perché i punti sono estremamente comuni negli URL.

Sì, la regex è tua amica qui, ma costruire la regex appropriata è la parte difficile.

Dai un'occhiata anche a questo: Espansione degli URL con Regex in .NET.

Puoi aggiungere ulteriore controllo su questo utilizzando la funzione delegata MatchEvaluator con l'espressione regolare:supponiamo di avere questa stringa:

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

ora prova questo codice

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;
}

/tifo per i RedWolves

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

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

C'è il codice per gli indirizzi "anyprotocol"://"anysubdomain/domain"."anydomainextension and address",

ed è un esempio perfetto per altri usi della manipolazione delle stringhe.puoi tagliare e tagliare a dadini a piacimento con .replace e inserire gli "a href" appropriati dove necessario.

Ho utilizzato jQuery per modificare facilmente gli attributi di questi collegamenti in "target=_blank" nella mia logica di caricamento dei contenuti, anche se il metodo .link non consente di personalizzarli.

Personalmente adoro aggiungere un metodo personalizzato all'oggetto stringa per il filtraggio delle stringhe al volo (la dichiarazione String.prototype.linkify), ma non sono sicuro di come funzionerebbe in un ambiente su larga scala in cui avresti devo organizzare più di 10 funzioni personalizzate simili a linkify.Penso che a quel punto dovresti sicuramente fare qualcos'altro con la struttura del tuo codice.

Forse un veterinario verrà qui e ci illuminerà.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top