2008-08-28 41 views
14

Sto consumando l'API di Twitter e voglio convertire tutti gli URL in collegamenti ipertestuali.Il modo più semplice per convertire un URL in un collegamento ipertestuale in una stringa C#?

Qual è il modo più efficace con cui sei arrivato a fare questo?

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> 
+0

Per questa applicazione si dovrebbe cercare una soluzione che corrisponda esattamente a come Twitter stesso analizza gli URL - potrebbe funzionare un'espressione regolare; assicurati di usare la stessa condizione per far corrispondere la fine dell'URL (rispetto a cose come punti e parentesi tonde) come fa Twitter. –

risposta

21

Le espressioni regolari sono probabilmente il tuo amico per questo tipo di compito:

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

L'espressione regolare per la corrispondenza degli URL, potrebbe essere necessario un po 'di lavoro.

+2

Penso che sia soddisfacente, le espressioni regolari sono potenti, ma catturare mentre non-spazio bianco è molto meglio che provare a implementare un parser di URL in espressioni regolari. Potrei cambiarlo in '(https?: // [^] +)' perché https non è così raro. –

5

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

http://example.com/. 

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

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

non si può semplicemente analizzare fino a trovare uno spazio, perché allora si terrò il periodo come parte dell'URL. Non puoi semplicemente analizzare fino a quando non viene trovato un punto o uno spazio, perché i periodi sono estremamente comuni negli URL.

Sì, regex è tuo amico qui, ma la costruzione della regex appropriata è la parte difficile.

Controllare anche questo: Expanding URLs with Regex in .NET.

+0

Questo era perfetto .. :) – TimLeung

+0

Ho comprato il mio da http://tempuri.org/. –

7

ho fatto esattamente la stessa cosa con jquery consuming the JSON API qui è 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); 
    }); 
}; 
1

/tifo per RedWolves

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

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

C'è il codice per gli indirizzi "anyprotocol":?. // "anysubdomain/dominio" "anydomainextension e indirizzo",

ed è un perfetto esempio per altri usi della manipolazione delle stringhe. puoi tagliare e tagliare a volontà con .replace e inserire i "a href" appropriati, se necessario.

Ho usato jQuery per modificare facilmente gli attributi di questi collegamenti su "target = _blank" nella logica di caricamento del contenuto, anche se il metodo .link non consente di personalizzarli.

Personalmente adoro virare su un metodo personalizzato per l'oggetto stringa per il filtraggio di stringa al volo (String.prototype.linkify declaration), ma non sono sicuro di come si svolgerà in un ambiente su larga scala in cui dovresti organizzare più di 10 funzioni personalizzate di tipo linkify. Penso che sicuramente dovresti fare qualcos'altro con la tua struttura di codice a quel punto.

Forse un veterinario inciamperà qui e ci illuminerà.

1

È possibile aggiungere un po 'di controllo su questo tramite la funzione di delegato MatchEvaluator con l'espressione regolare: Supponiamo che io ho questa stringa:

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

Ora provate 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; 
} 
Problemi correlati