我有一个用户评论的文本字段,用户可能会也可能不会在此字段中插入网址。
e.g。他们可以拥有以下任何一种(以及其他变体):
我想要做的是匹配这些并更改字符串以包含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部分?
有趣的是,当我输入这个问题时,预览部分正在创建上述网址中的链接 - 除了我的&#34;麻烦&#34; one - 没有http / ftp://前缀的那个。
答案 0 :(得分:3)
使用匹配评估程序检查组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
。