【问题标题】:Regex to create html anchor tag正则表达式创建 html 锚标记
【发布时间】:2017-06-01 13:12:14
【问题描述】:

我有一个用于用户 cmets 的文本字段,用户可能会也可能不会在此字段中插入 URL。

例如它们可以具有以下任何一种(以及其他变体):

我想要做的是匹配这些并更改字符串以包含 HTML 锚标记。

使用有关此主题的各种其他 Stack Overflow 答案,我想出了以下内容:

text = text.Trim();
text = Regex.Replace(text,
    @"((https?|ftp):\/\/(?:www\.|(?!www))[^\s\.]+\.[^\s]{2,}|www\.[^\s]+\.[^\s]{2,})",
    "<a target='_blank' href='$1'>$1</a>");

这几乎可以完美地工作,它匹配所有必需的模式但是当它与 www.google.com 匹配时(没有 http(s)://) 部分,创建的锚标记不正确,href 的锚点需要 http:// 部分,或者它将链接创建为站点的相对 url。

如何更改上面的代码,以便如果匹配项不包含 http:// 部分,它将添加到锚点的 href 部分?

有趣的是,当我输入这个问题时,预览部分正在从我上面的 URL 创建链接——除了我的“麻烦”一个——没有 http/ftp:// 前缀的链接。

【问题讨论】:

  • 对此您无能为力。第一步是尝试找到适用于所有情况的规则集(人类可读)。一些患有严重胸膜炎的人经常省略空格,这会导致像end of sentence.new sentence 这样的字符串。在这种情况下,您不希望生成指向 http://sentence.new 的链接。
  • reg ex 只会在 www.someexample.com 上使用,即带有 www.前缀,并且不会在 sentence.new 上接听。

标签: c# regex


【解决方案1】:

使用匹配评估器检查第 2 组 ((https?|ftp)) 是否匹配。如果没有,使用一种逻辑,否则,使用另一种。

var text = "Look at http://google.com some more text here possibly,\nLook at www.google.com some more text here possibly";
text = text.Trim();
text = Regex.Replace(text,
    @"((https?|ftp)://(?:www\.|(?!www))[^\s.]+\.\S{2,}|www\.\S+\.\S{2,})", m => 
    m.Groups[2].Success ? 
       string.Format("<a target='_blank' href='{0}'>{0}</a>", m.Groups[1].Value) :
       string.Format("<a target='_blank' href='http://{0}'>{0}</a>", m.Groups[1].Value));
Console.WriteLine(text);

C# demo,输出:

Look at <a target='_blank' href='http://google.com'>http://google.com</a> some more text here possibly, 
Look at <a target='_blank' href='http://www.google.com'>www.google.com</a> some more text here possibly

请注意,我将模式中的 [^\s] 替换为 \S 以使其看起来“更漂亮”。

您也可以删除外部捕获组(并使用@"(https?|ftp)://(?:www\.|(?!www))[^\s.]+\.\S{2,}|www\.\S+\.\S{2,}" 模式),然后检查m.Groups[1].Success 是否为真并在替换中使用m.Value

【讨论】:

  • 只是想完全理解它是如何工作的,而 m.groups[2] 部分让我很困惑 - 你能简单解释一下吗?
  • 您的正则表达式包含 2 个使用 (...) 定义的捕获组,请参阅 this regex demo。第一个是捕获整个模式的外部组(实际上甚至没有必要,匹配值包含整个匹配,或者Groups[0].Value,或者您可以随时通过字符串替换模式中的$&amp;访问它) ,另一个在http/ftp附近。如果组 2 匹配,则其 Succcess 属性设置为 true
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-19
  • 2017-10-04
  • 1970-01-01
  • 2013-11-27
  • 1970-01-01
相关资源
最近更新 更多