注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

mie

 
 
 

日志

 
 

【修正】正则表达式:提取URL中的DNS域名(各种情况基本上都考虑到了)  

2011-04-15 18:50:37|  分类: 网络开发 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

先列出需要考虑的各种情况:

(1)www.abc(错误的情况)
(2)www.abc.com
(3)www.abc.com/hah.htm
(4)www.abc.com/h/hah.htm
(5)http://www.abc.com/h/hah.htm

(6)http://adc.abc.com/h/hah.htm

(7)http://adc.gpc.abc.com/h/hah.htm

(8)ftp://adc.gpc.abc.com/h/hah.htm

(9)https://adc.gpc.abc.com/h/hah.htm

(10)http://adc.gpc.abc.com:8080/h/hah.htm

(11)http://192.168.2.1:8080/h/hah.htm

(12)http://192.168.2.1/h/hah.htm

(13)https://adc.gpc.abc.com.cn/h/hah.htm

(14)adc.gpc.abc.com.cn/h/hah.htm

(15)abc.com.cn/h/hah.htm

(16)abc.com.cn:8080/h/hah.htm

(17)https://adc.gpc.ab-c.com.cn/h/hah.htm

第一种情况应该是匹配失败。
第11、12:应该解析出192.168.2.1。
其他情况,或者解析出abc.com,或者是abc.com.cn。

(1)为此,第一个匹配的正则,负责解析出多级域名或者IP地址。正则:(?i)[://|]?(www\.)?(?<DNS>([\w|-]+\.)+(\w+)+)\/?.*
解析的结果就是:DNS="abc.com",DNS="abc.com.cn",DNS="192.168.2.1",DNS=“adc.gpc.abc.com.cn”,DNS=“adc.gpc.abc-d.com.cn”。

再进一步提取出一级域名。
(2)判断是否是IP。如果是,返回IP,即可。正则:(?<DNS>((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)))
如果IP不为空,说明是IP地址,返回。否则继续。
至此,DNS="192.168.2.1"之类的IP被全部解析。

(3)解析至此,剩下的都是域名了。但是,域名有一级域名、二级域名,乃至三级域名等,比如:zhan.blog.163.com就是一个三级域名。同时,还有.com.cn、.com、.cn、.net.cn之类的,而且,还不能直接剔除com.cn。再次列出各种可能的情况:
(a1)a.com
(a2)a.cn

(a3)haha.com.cn

(a4)t.s.hoho.com.cn

(a5)abc.hehe.com.cn


这里注意一下,haha.com.cn可不是www.com.cn的二级域名!要不然,DNS服务器就傻眼了,它不知道怎么解析的。所以,www.com.cn不存在二级域名的。

其实,按照书本上的说法,hoho.com.cn也应该算是二级域名了。但是,这里只能当作一级域名处理。要不然,所有的*.com.cn都是www.com.cn下面的,也就没法识别出哪个URL对哪个网站了。

(a6)google.com.hk

(a7)google.gov.cn

(a8)google.net.cn
(a9)adc.gpc.abc-d.com.cn
......

类似的还有很多。这里的处理稍微有些麻烦。我的方法是:先计算出“.”点号的个数,如果是一个,直接返回。为此,有正则:(?<DNS>^[\w|-]+\.\w+$)
解析成功,则说明已经是域名了。函数返回。

(4)最后一步,从多级域名中提取出一级域名。
正则:(?i)(\w+\.){0,3}\.?(?<DNS>((?!(com\.|net\.|gov\.|edu\.))(\w+\.){1,2}\w+)
此正则表达式考虑不周,只是对.com.cn、.net.cn、.edu.cn、.gov.cn等几种情况做了处理,但类似的域名后缀应该还有。

至此,解析完毕。

小结:
(1)(提取DNS)(?i)[://|]?(?<DNS>(\w+\.)+(\w+)+)\/?.*
(2)(判断是否是IP地址)(?<IP>((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?))),成功则表明取得域名(IP地址),函数返回。
(3)(提取一级域名,判断是否已经是域名,如果是,返回)
(?<DNS>^\w+\.\w+$),成功则表明取得域名,函数返回。
(4)(提取一级域名)(?i)([\w|-]+\.){0,3}\.?(?<DNS>((?!(com\.|net\.|gov\.|edu\.))([\w|-]+\.){1,2}\w+),之后函数返回。

2011.04.16修正:
    之前没有考虑到这种有横杠的情况:"www.abc-d.com",修改了一下。还是有点缺憾,因为“www.-a-.com”这类以横杠开头或者结尾的域名是不合法的,但是我却没有考虑。

By:zhanyonhu
  评论这张
 
阅读(1740)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016