判断一个域名是否合法

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

 

常见的域名形式

 

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

 

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

 

共同特征

 

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

 

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

 

判断方法

 

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

 

代码

 

因为域名众多,直接写在代码中不方便,因而将域名存在文件里(不带.号):code

 

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 zwblog

 

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

 

Python代码:ci

 

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”。