正则表达式创建html锚标记

时间:2017-01-17 12:51:24

标签: c# regex

我有一个用户评论的文本字段,用户可能会也可能不会在此字段中插入网址。

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://前缀的那个。

1 个答案:

答案 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