在C#字符串中将URL转换为超链接的最简单方法是什么?

18

我正在使用Twitter API,并希望将所有URL转换为超链接。

你想到的最有效的方法是什么?

来自:

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

针对这个应用程序,您应该寻找与Twitter自身解析URL完全匹配的解决方案-正则表达式可能有效;只需确保使用与Twitter相同的条件来匹配URL的结尾(而不是像点和右括号之类的东西)。 - Kevin Reid
5个回答

24

正则表达式可能是您在此类任务中的好帮手:

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

匹配URL的正则表达式可能需要一些修改。


2
我认为这很好,正则表达式非常强大,但是捕获非空格字符比尝试在正则表达式中实现URL解析器要好得多。也许我会将其更改为(https?://[^ ]+),因为https并不那么罕见。 - John Leidegren

7

我曾经使用jQuery消费JSON API来完成这个完全相同的事情,以下是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);
    });
 };

6

这实际上是一个麻烦的问题。URL可以包含(并以)标点符号结尾,所以在普通文本中嵌入URL时很难确定URL的实际结尾。例如:

http://example.com/.

这是一个有效的URL,但它也可能只是一句话的结尾。

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

您不能简单地解析到找到一个空格,因为那样您会将句点作为URL的一部分保留下来。您也不能简单地解析到找到一个句点或空格,因为句点在URL中非常常见。
是的,正则表达式在这里很有用,但构造适当的正则表达式是困难的。
还可以查看:在.NET中使用正则表达式扩展URL

1
你可以使用MatchEvaluator委托函数和正则表达式来对此进行更多控制: 假设我有这个字符串:
find more on http://www.stackoverflow.com 
现在尝试这段代码
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;
}

1

/cheer for RedWolves

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

请参阅:/ [A-Za-z] +:\/\/ [A-Za-z0-9- ] +。[A-Za-z0-9- :%& \?/。=] + /

这是用于地址“anyprotocol”://“anysubdomain / domain”。“anydomainextension和address”的代码,

它是其他字符串操作的完美示例。您可以使用.replace随意切割并插入所需的适当“a href”。

我使用jQuery轻松更改这些链接的属性为“target = _blank”,即使.link方法不允许您自定义它们。

我个人喜欢在字符串对象上附加自定义方法以进行即时字符串过滤(String.prototype.linkify声明),但我不确定在需要组织10多个自定义linkify类似函数的大规模环境中会发生什么。我认为在那一点上,您肯定必须对代码结构做出其他处理。

也许一位兽医会偶然路过这里并启发我们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接