Der einfachste Weg, eine URL in einen Hyperlink in einer C#-Zeichenfolge umzuwandeln?
Frage
Ich nutze die Twitter-API und möchte alle URLs in Hyperlinks umwandeln.
Was ist Ihrer Meinung nach der effektivste Weg, dies zu tun?
aus
string myString = "This is my tweet check it out http://tinyurl.com/blah";
Zu
This is my tweet check it out <a href="http://tinyurl.com/blah">http://tinyurl.com/>blah</a>
Lösung
Reguläre Ausdrücke sind wahrscheinlich Ihr Freund für diese Art von Aufgabe:
Regex r = new Regex(@"(https?://[^\s]+)");
myString = r.Replace(myString, "<a href=\"$1\">$1</a>");
Der reguläre Ausdruck zum Abgleichen von URLs erfordert möglicherweise etwas Arbeit.
Andere Tipps
Ich habe genau das Gleiche damit gemacht jquery verbraucht die JSON-API Hier ist die Linkify-Funktion:
String.prototype.linkify = function() {
return this.replace(/[A-Za-z]+:\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_:%&\?\/.=]+/, function(m) {
return m.link(m);
});
};
Das ist tatsächlich ein hässliches Problem.URLs können Satzzeichen enthalten (und damit enden). Daher kann es schwierig sein, zu bestimmen, wo eine URL tatsächlich endet, wenn sie in normalen Text eingebettet ist.Zum Beispiel:
http://example.com/.
ist eine gültige URL, könnte aber genauso gut das Ende eines Satzes sein:
I buy all my witty T-shirts from http://example.com/.
Sie können nicht einfach analysieren, bis ein Leerzeichen gefunden wird, da Sie dann den Punkt als Teil der URL behalten.Sie können auch nicht einfach analysieren, bis ein Punkt oder ein Leerzeichen gefunden wird, da Punkte in URLs sehr häufig vorkommen.
Ja, Regex ist hier Ihr Freund, aber die Erstellung des passenden Regex ist der schwierige Teil.
Schauen Sie sich auch das an: Erweitern von URLs mit Regex in .NET.
Sie können dies etwas mehr steuern, indem Sie die MatchEvaluator-Delegatenfunktion mit regulärem Ausdruck verwenden:Angenommen, ich habe diese Zeichenfolge:
find more on http://www.stackoverflow.com
Probieren Sie jetzt diesen Code aus
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;
}
/jubelt RedWolves zu
aus:this.replace(/[A-Za-z]+://[A-Za-z0-9-]+.[A-Za-z0-9-:%&\?/.=]+/, function(m){...
sehen:/[A-Za-z]+://[A-Za-z0-9-]+.[A-Za-z0-9-:%&\?/.=]+/
Es gibt den Code für die Adressen „anyprotocol“://“anysubdomain/domain“. „anydomainextension and address“,
und es ist ein perfektes Beispiel für andere Anwendungen der String-Manipulation.Mit .replace können Sie nach Belieben schneiden und würfeln und bei Bedarf die richtigen „a href“s einfügen.
Ich habe jQuery verwendet, um die Attribute dieser Links in meiner Logik zum Laden von Inhalten einfach in „target=_blank“ zu ändern, obwohl Sie sie mit der .link-Methode nicht anpassen können.
Ich persönlich liebe es, eine benutzerdefinierte Methode an das String-Objekt anzuhängen, um Strings im Handumdrehen zu filtern (die String.prototype.linkify-Deklaration), aber ich bin mir nicht sicher, wie sich das in einer großen Umgebung auswirken würde, in der Sie es tun würden Sie müssen mehr als 10 benutzerdefinierte Linkify-ähnliche Funktionen organisieren.Ich denke, an diesem Punkt müssten Sie definitiv etwas anderes mit Ihrer Codestruktur machen.
Vielleicht stolpert hier ein Tierarzt vorbei und klärt uns auf.