【发布时间】:2017-06-01 13:12:14
【问题描述】:
我有一个用于用户 cmets 的文本字段,用户可能会也可能不会在此字段中插入 URL。
例如它们可以具有以下任何一种(以及其他变体):
- 看看http://www.google.com这里可能还有一些文字
- 看https://www.google.com这里可能还有一些文字
- 看ftp://www.google.com这里可能还有一些文字
- 看http://google.com这里可能还有一些文字
- 查看 www.google.com 此处可能还有更多文字
我想要做的是匹配这些并更改字符串以包含 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 上接听。