Il modo più semplice per convertire un URL in un collegamento ipertestuale in una stringa C#?
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>
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à.