繁体   English   中英

正则表达式创建html锚标记

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM