[英]Regex to create html anchor tag
我有一个用户评论的文本字段,用户可能会也可能不会在此字段中插入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:// part或它创建链接作为站点的相对URL。
如何更改上面的代码,以便如果匹配不包含http://部分,它会将它添加到锚点的href部分?
有趣的是,当我输入这个问题时,预览部分正在创建我上面的URL中的链接 - 除了我的“麻烦”之外 - 没有http / ftp://前缀的那个。
使用匹配评估程序检查组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,}"
pattern @"(https?|ftp)://(?:www\\.|(?!www))[^\\s.]+\\.\\S{2,}|www\\.\\S+\\.\\S{2,}"
然后检查m.Groups[1].Success
是否为true并在替换中使用m.Value
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.