判断一个域名是否合法

生活中我们肯定会见到很多域名(domain name,简称domain)。域名有很多形式,以句点(.)作为分隔符。这里说的域名是纯域名,不是网址,不包括http://(或https://),也不带斜线。

 

常见的域名形式

 

1. 由两个部分组成,例如baidu.com(百度),csdn.net(CSDN),wikipedia.org(维基百科)。

 

2. 由多个部分组成,例如en.wikipedia.org(英文维基百科),support.google.com(Google帮助页面),info.cern.ch(世界上的第一个网站),acm.hdu.edu.cn(HDU Online Judge)。

 

共同特征

 

1. 最后一部分是顶级域名(top-level domain),顶级域名不能随便取,只能是有限的顶级域名之一。

 

2. 域名中只能包含数字、字母和连字符(好像每个域名要求还不同)。

 

判断方法

 

以'.'为分隔符,将域名分成几个部分,最后一部分必须是合法的顶级域名,其它部分不得包含非字母、数字和连字符。实际上还可以包含中文(Unicode字符),这里不考虑。

 

代码

 

由于域名众多,直接写在代码中不方便,于是将域名存在文件里(不带.号):

 

com org net int edu gov mil arpa
ac ad ae af ag ai al am an ao aq ar as at aw ax az
ba bb bd be bf bg bh bi bj bl bm bn bo bq br bs bt bv bw by bz
ca cc cd cf cg ch ci ck cl cm cn co cr cu cv cw cx cy cz
de dj dk dm do dz
ec ee eg eh er es et eu
fi fj fk fm fo fr
ga gb gd ge gf gg gh gi gm gn gp gq gr gs gt gu gw gy
hk hm hn hr ht hu
id ie il im in io iq ir is it
je jm jo jp
ke kg kh ki km kn kp kr kw ky kz
la lb lc li lk lr ls lt lu lv ly
ma mc md me mf mg mh mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz
na nc ne nf ng ni nl no np nr nu nz
om
pa pe pf pg ph pk pl pm pn pr ps pt pw py
qa
re ro rs ru rw
sa sb sc sd se sg sh si sj sk sl sm sn so sr ss st su sv sx sy sz
tc td tf tg th tj tk tl tm tn to tp tr tt tv tw tz
ua ug uk um us uy uz
va vc ve vg vi vn vu
wf ws
ye yt
za zm zw

 

把文件命名为domains.txt,并且可能需要把它添加到PYTHONPATH。

 

Python代码:

 

def isValidDomainChar(ch):
    return ch.isalpha() or ch.isdigit() or ch == '-'

def isValidDomainSect(sect):
    return len(sect) > 0 and all(isValidDomainChar(ch) for ch in sect)

def areValidDomainSects(sects):
    return all(isValidDomainSect(sect) for sect in sects)

def isValidDomain(domain):
    sects = domain.split('.')
    global TLDS
    return areValidDomainSects(sects[0:-1]) and sects[-1] in TLDS

def main():
    with open('domains.txt', 'r') as f:
        import re
        global TLDS
        TLDS = re.split(' |\n', f.read())
    domain = input('Enter a domain: ')
    while domain != '':
        if isValidDomain(domain):
            print('Domain valid.')
        else:
            print('Domain invalid.')
        domain = input('Enter a domain: ')

TLDS = []
if __name__ == '__main__':
    main()

 

注意需要将domains.txt所在目录添加到PYTHONPATH。另外,顶级域名有很多,domains.txt里只列出了一部分,还有很多。具体的可以在Wiki上搜“Top-level domains”。

posted @ 2017-06-14 21:30  collectionne  阅读(13294)  评论(0编辑  收藏  举报