【问题标题】:Easiest way to convert a URL to a hyperlink in a C# string?将 URL 转换为 C# 字符串中的超链接的最简单方法?
【发布时间】:2010-09-07 03:40:57
【问题描述】:

我正在使用 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 的结尾(相对于点和右括号)。

标签: c# regex string hyperlink


【解决方案1】:

正则表达式可能是您完成此类任务的朋友:

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

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

【讨论】:

  • 我认为这很好,正则表达式很强大,但是在非空格时捕获比尝试在正则表达式中实现 URL 解析器要好得多。我可能会将其更改为 (https?://[^ ]+) 因为 https 并不少见。
【解决方案2】:

我对 jquery consuming the 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);
    });
 };

【讨论】:

    【解决方案3】:

    这实际上是一个丑陋的问题。 URL 可以包含(并以)标点符号,因此当 URL 嵌入到普通文本中时,很难确定 URL 的实际结束位置。例如:

    http://example.com/.
    

    是一个有效的 URL,但它也很容易成为句子的结尾:

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

    在找到空格之前,您不能简单地解析,因为这样您就会将句点保留为 URL 的一部分。在找到句点或空格之前,您也不能简单地解析,因为句点在 URL 中非常常见。

    是的,正则表达式是你的朋友,但构建适当的正则表达式是困难的部分。

    也请查看:Expanding URLs with Regex in .NET

    【讨论】:

      【解决方案4】:

      您可以通过使用带有正则表达式的 MatchEvaluator 委托函数来添加更多控制: 假设我有这个字符串:

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

      【讨论】:

        【解决方案5】:

        /为红狼队加油

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

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

        这里有地址“anyprotocol”://“anysubdomain/domain”.“anydomainextension and address”的代码,

        它是字符串操作的其他用途的完美示例。您可以使用 .replace 随意切片和切块,并在需要的地方插入适当的“a href”。

        我使用 jQuery 在我的内容加载逻辑中轻松地将这些链接的属性更改为“target=_blank”,即使 .link 方法不允许您自定义它们。

        我个人喜欢为字符串对象添加一个自定义方法以进行动态字符串过滤(String.prototype.linkify 声明),但我不确定这将如何在大规模环境中发挥作用您必须组织 10 多个自定义的类似 linkify 的功能。我认为那时你肯定需要对你的代码结构做一些其他的事情。

        也许兽医会在这里偶然发现并启发我们。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-04-16
          • 2014-12-22
          • 2013-09-16
          • 2010-12-21
          • 2012-01-07
          • 2012-09-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多