如何顶级域名判断

我们这里只考虑英文字母的域名情况,并且不考虑后来开放申请之后类似与.google、.youtube之类的奇葩域名。

通过观察我们容易得到如下结论:
1、我们用.将域名分成好多段,那么主域名只可能有两段或者三段;
2、主域名的名称后面,有三种情况,跟着通用顶级域名(zhihu.com)、跟着国家顶级域名(12306.cn)和跟着两段顶级域名的(sina.com.cn)。

还有以下事实:
1、通用顶级域有Generic top-level domain中所列的22个;
2、国家顶级域名按照国际标准ISO 3166-1 alpha-2只分配两个字母(英国佬比较奇葩,标准中规定他们用.gb,但是他们更喜欢用.uk,实际上两个都是他们的)。

所以,如果最后一节是两个字符,那么可以判定为是国家顶级域名,然后往前看一节,如果这一节不是通用顶级域名,那么我们把最后两节当作主域名;如果是,那么我们把最后三节当作主域名。

如果最后一节不是两个字符,那么我们把最后两节当作主域名。

两种情况的流程合并之后,就是我们直接看域名的倒数第二节,如果这一节是通用顶级域名,那么我们把最后三节当成主域名,否则我们只把最后两节当成主域名。

另外说明一下特例:
1、部分国家会使用不在通用顶级域名之中的二级域,例如bbc.co.uk,我们只要把.co当作加到通用顶级域名的列表里面就可以正常处理得到bbc.co.uk
2、 不少教科书上都写了.ac是科研机构的顶级域名,但同时也是英属阿森松岛的国家顶级域名。可以加入到通用顶级域名列表里面,如果在倒数第二节发现该域名, 那么可以判定为某国研究机构的域名;如果在最后一节中发现,并且倒数第二节中还出现.com之类的域名,那么显然不是研究机构。判断逻辑与上述逻辑无差。

--------
谢邀,我能想到的是,即使你把顶级域名全部列举了,还是没有办法判定像中华人民共和国中央人民政府门户网站这样的域名,到底哪个部分是顶级域名。所以,大致的思路只能是顶级域名列表加上特例列表。

<think>好的,用户想用JavaScript检测域名的有效性,我得仔细想想怎么回答。首先得回忆一下之前提到的引用内容。引用1里有个checkDomain函数,但看起来有点过时,比如用alert可能不太友好,而且验证逻辑可能不够全面。引用4提到用newURL来验证URL,这可能更现代一些。不过用户需要的是域名验证,而不仅仅是整个URL。首先,确定用户的需求是验证域名,比如类似“example.com”这样的字符串。需要检查域名的结构,比如是否包含点,是否有有效的后缀,字符是否合法等。可能还需要考虑国际化域名,但可能用户暂时不需要,先处理基本的ASCII域名。然后,参考引用1里的代码,里面检查了字符是否在允许的集合里,还检查了是否包含点。但那个方法可能不够准确,比如域名不能以点开头或结尾,中间不能有连续的点,还有域名的各部分长度限制。此外,顶级域名(TLD)应该至少有两个字符,比如.com,但像.io这样的也是允许的,不过有些国家代码TLD是两字母的,比如.cn,所以需要确保后缀部分至少有两个字符。另外,引用3提到使用WHOIS查询,但用户可能不需要实时检查域名是否被注册,只是验证格式的有效性。所以可以暂时忽略WHOIS部分,专注于格式验证。 现在,考虑使用正则表达式。引用2和4都用了正则,可能更高效。需要构建一个匹配域名的正则表达式。域名每个部分由字母数字和连字符组成,但不能以连字符开头或结尾,顶级域名至少两个字符,整体结构为xxx.xxx的形式。然后,可能的步骤是:1.检查基本结构是否符合;2.拆分域名部分和TLD;3.验证各部分是否符合规则。或者用一个复杂的正则表达式一次性验证。 同时,引用4中的方法使用newURL,但需要构造完整的URL,比如加上http://前缀,再提取hostname。这可能更简单,因为浏览器内置的解析器已经处理了大部分规则。比如,如果用户输入的是“example.com”,构造http://example.com,然后用URL对象解析,再取hostname,看是否匹配。这样可以避免自己写复杂的正则,但可能不够灵活,比如允许不必要的字符?需要权衡两种方法的优缺点。正则表达式可以更精确控制,但编写复杂;使用URL对象更简便,但可能有边缘情况处理不同。 所以,给两种方法:一种是正则表达式,另一种是利用URL对象。并说明各自的优缺点。然后,代码示例部分,需要确保正确性。比如正则表达式要考虑域名各部分,避免非法字符,长度限制等。例如:/^(?!-)[A-Za-z0-9-]{1,63}(?<!-)(\.(?!-)[A-Za-z0-9-]{1,63}(?<!-))+$/ 这个正则可能还不够,因为顶级域名至少两个字符,可能需要额外检查。或者拆分成多个步骤,先验证整体结构,再检查TLD长度。 另外,引用1中的代码检查了是否包含点,但可能没有处理多个点的情况,比如“example..com”应该无效。正则表达式中的(\. ...)+可以确保至少一个点,并且每部分符合要求。最后,生成相关问题,比如如何处理子域名,国际化域名,或者使用第三方库。还要考虑性能问题,比如正则表达式和URL解析哪种更高效。</think>### JavaScript域名有效性验证方法 通过正则表达式和浏览器API可实现域名有效性验证,以下是两种常用方法: #### 方法一:正则表达式验证(基础版) ```javascript function validateDomain(domain) { const regex = /^(?!-)[A-Za-z0-9-]{1,63}(?<!-)(\.(?!-)[A-Za-z0-9-]{1,63}(?<!-))+\.[A-Za-z]{2,}$/; return regex.test(domain); } console.log(validateDomain("google.com")); // true console.log(validateDomain("sub.domain.co")); // true console.log(validateDomain("-invalid.com")); // false ``` 该正则表达式实现: 1. 禁止开头/结尾连字符 `(?!-)` 和 `(?<!-)` 2. 每段长度1-63字符 `{1,63}` 3. 顶级域名至少2字母 `{2,}` 4. 支持多级子域名 #### 方法二:URL API验证(推荐) ```javascript function checkDomain(domain) { try { new URL(`http://${domain}`); return domain.split('.').every(part => part.length <= 63 && /^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/i.test(part) ); } catch { return false; } } console.log(checkDomain("example.org")); // true console.log(checkDomain("a")); // false ``` 此方法优势: 1. 自动处理域名解析规则 2. 支持国际化域名(需配合Punycode转换) 3. 内置长度校验 [^1]: 基于RFC 1034域名规范的验证逻辑 [^4]: URL API的现代验证方案
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值