2013-02-18 103 views
1

我正在使用C#为这个项目,基本上我需要的是一种将纯文本转换为HTML的方式,我找到了一个正则表达式(实际上是Stack Overflow),用于将文本中的链接转换为在HTML锚链接,它看起来像这样:正则表达式与URL提取

 Regex regx = new Regex(@"https?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?", RegexOptions.IgnoreCase); 

     MatchCollection mactches = regx.Matches(input); 
     foreach (Match match in mactches) 
     { 
      output = output.Replace(match.Value, String.Format("<a href=\"{0}\" target=\"_blank\">{0}</a>", match.Value)); 
     } 

它的伟大工程,但我发现,它并没有考虑破折号一个缺陷( - )作为URL的一部分,所以当它击中第一破折号关闭锚标记。 所以我很明显需要在正则表达式中包含破折号,但问题是我完全不知道RegEx的情况,它对我来说看起来像俄语。 有没有人有一个想法,我需要对RegEx表达做些什么小小的修改,以便在URL中包含一个破折号作为允许的字符?

+0

你可以举一个它不匹配的URL的例子吗?我的测试表明它的确如此。 – 2013-02-18 05:18:27

+0

另外,你有'matches'拼写错误:p – 2013-02-18 05:24:53

回答

2

试试这个:@"https?://([-\w\.]+)+(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)?"

我添加了一个冲向第二个字符类(方括号中的部分)中,是不是域名的URL部分匹配破折号。

+0

+1。就如此容易。我没有意识到OP有目录问题。 – 2013-02-18 05:23:42

+0

优秀!非常感谢,修复它。 问题在于“漂亮”SEO链接中带有破折号的网址,例如:http://www.yourdomain.com/this-pretty-link-didnt-work-before-now-it-does – Thomas 2013-02-18 06:58:33

0

我用这一个支撑ftpfile方案以及http

@"\b((https?|ftp|file)://|(www|ftp)\.)[-A-Z0-9+&@#/%?=~_|$!:,.;\(\)]*[A-Z0-9+&@#/%=~_|$]" 

将认识到,包含由&分隔的参数,这样的网址:

http://www.cbsnews.com/video/watch/?id=7400904n&tag=re1.channel

原文位于Extract URLs from a text (Regex)。我修改了它稍微认识到,包含这样的括号中的URL:

http://msdn.microsoft.com/en-us/library/ms686722(v=VS.85).aspx

您需要与此正则表达式指定RegexOptions.IgnoreCase但当然,你可以用\w更换A-Z简化。