日期:2014-05-18  浏览次数:21177 次

正则表达式匹配"网址"出现的新问题,网上没有找到解决方法,求救各位高手

要做一个验证输入内容中是否有超链接的项目
要使用正则表达式
(http(s)?://([\w-]+\.)+[\w-]+(/[\w-] ./?%&=]*)?)
这个不能完全验证,例如:字符串中网站的结束不是以空格和回车就不能验证
输入下面内容:
我今天发现了一个网站http://www.baidu.com是搜索用的
链接的时候把“是搜索用的”也链接上了。
在比如不是http://开头:“我今天发现了一个网站www.baidu.com是搜索用的”
他就不链接了 ,为此我改了一下
如下:
/// <summary>
/// 验证内容中是否有超链接
/// </summary>
/// <param name="value">验证的内容</param>
/// <returns></returns>
private string ParseString(string sDetail)
{  
  Match m;
  bool doit = false;
//内容中是否有含有www.开头的字符串,并且后面不是中文
  Regex r = new Regex(@"((www)(\.([A-Za-z0-9]+(-[A-Za-z0-9]+)*))*(\?\S*)?)", RegexOptions.IgnoreCase);
  for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
  {
  doit = true;
  sDetail = sDetail.Replace(m.Groups[0].ToString(), "<a href=\"http://" + m.Groups[0].ToString() + "\" target=\"_blank\">" + m.Groups[0].ToString() + "</a>");
  }
  if (doit == false)
  {
//内容中是否有含有http://开头的字符串,并且后面不是中文
  Regex re = new Regex(@"(http(s)?://([\w-]+\.)+[A-Za-z0-9]+(/[A-Za-z0-9] ./?%&=]*)?)", RegexOptions.IgnoreCase);

  for (m = re.Match(sDetail); m.Success; m = m.NextMatch())
  {
  sDetail = sDetail.Replace(m.Groups[0].ToString(), "<a href=\"" + m.Groups[0].ToString() + "\" target=\"_blank\">" + m.Groups[0].ToString() + "</a>");  
  }
  }  
  return sDetail;
}
这样的问题基本解决了,
(其实这样还有一个问题:就是在一个即有www.开头,又有http://开头的字符串中,他就不验证http://开头的了。这个先不计较)
但是新的问题又出来了:
例如输入的是:
http://zhidao.baidu.com/question/16409889.html?fr=idrm (假设该网址存在)
则超链接的只有“http://zhidao.baidu.com”
因为正则把不是字母、数字的排除了
其实这个正则式:(http(s)?://([\w-]+\.)+[\w-]+(/[\w-] ./?%&=]*)?)基本就可以,
但是在没有空格和回车的情况下该如何有效的找到超链接,
还望高手指点~~~
谢谢~~

------解决方案--------------------
再次修改为:
\b(?(https?://|www)(?:https?://|www)[\w/.?=%&]+\b|(?:[\w/?=%&]+\.)+[\w/?=%&]+\b)
------解决方案--------------------
再次修改为:
C# code

\b(?(https?://|www)(?:https?://|www)[\w/.?=%&]+\b|(?:[\w/?=%&]+\.)+[\w/?=%&]+\b)

------解决方案--------------------
不知道你如何测试的,我打开baidu,搜索:“不知道”,得到的网页,用这个正则搜索,结果正确和错误的都有
C# code

\b(?(https?://|www)(?:https?://|www)[\w/.?=%&-]+\b|(?:[\w/?=%&-]+\.)+[\w/?=%&-]+\b)

------解决方案--------------------
//////////引用/////////////////
使用正则:

\b(?(https?:// ¦www)(?:https?:// ¦www)[\w/.?=%&]+\b ¦(?:[\w/?=%&]+\.)+[\w/?=%&]+\b) 

输入:我今天发现了一个网站http://www.baidu.com是搜索用的
得到结果:
我今天发现了一个网站http:// <A href="www.baidu.com是搜索用的" target="_blank" >www.baidu.com是搜索用的 </A >

可以使用
但输入:我今天发现了一个网站www.baidu.com是搜索用的
输出结果:
<A href="我今天发现了一个网站www.baidu.com是搜索用的" target="_blank" >我今天发现了一个网站www.baidu.com是搜索用的 </A >
又不行了
//////////引用/////////////////

匹配出的结果比输入的还多?你测试例子有问题吧。
------解决方案--------------------
(?=https?://|(?:[a-z-]+\.)+(?:com|cn|net|org|gov|mobi|biz|cc|tv|name|info))(?:https?:)?[a-z&/?.\-=]*