如何用JavaScript正则表达式从域名列表中正确提取主域名
嘿,我太懂这种抓耳挠腮的感觉了——从一堆带前缀的域名里精准抠出主域名,用正则确实容易踩坑,尤其是碰到bbc.co.uk这种多后缀的域名时,普通正则根本hold不住。我来给你分享两个靠谱的解决方案,帮你搞定这个问题:
提取主域名的实用方案
方法一:用公共后缀列表库(强推!)
手动写正则很难覆盖所有奇葩域名场景,比如.co.uk、.com.hk这种二级公共后缀,最好直接用维护完善的工具库。这里推荐psl,它是Mozilla公共后缀列表的JS实现,能识别所有已知的后缀规则。
步骤:
- 先安装依赖:
npm install psl
- 写提取逻辑:
const psl = require('psl'); function getMainDomain(domain) { const parsedResult = psl.parse(domain); // parsedResult.domain 就是我们要的主域名,解析失败就返回原域名兜底 return parsedResult.domain || domain; } // 测试几个例子看看效果: console.log(getMainDomain('developer.mozilla.org')); // 输出 mozilla.org console.log(getMainDomain('bbc.co.uk')); // 输出 bbc.co.uk console.log(getMainDomain('mail.google.com.hk')); // 输出 google.com.hk
这个方法基本能搞定99%的域名场景,因为它背后是持续更新的公共后缀列表,比自己瞎写正则靠谱多了。
方法二:手动正则(适合简单场景)
如果你不想额外装库,只需要处理.com、.org、.net这种单后缀的普通域名,可以试试这个简化版正则:
function getSimpleMainDomain(domain) { // 匹配最后两段有效域名,忽略前面的子域名前缀 const matchResult = domain.match(/^(?:.*\.)?([a-z0-9-]+\.[a-z]{2,6})$/i); return matchResult ? matchResult[1] : domain; } // 测试: console.log(getSimpleMainDomain('developer.mozilla.org')); // 输出 mozilla.org console.log(getSimpleMainDomain('blog.example.com')); // 输出 example.com
⚠️ 注意:这个正则搞不定多后缀域名,比如bbc.co.uk会被提取成co.uk,而不是正确的bbc.co.uk,所以只适合需求简单的场景。
为啥你的正则没生效?
大概率是没考虑到多后缀域名的情况,或者捕获组的写法有问题。比如如果你的正则是/\.([^.]+\.[^.]+)$/,虽然能搞定developer.mozilla.org,但碰到bbc.co.uk就会错把co.uk当成主域名。而公共后缀列表的方法能准确区分“公共后缀”和主域名部分,所以不会出错。
内容的提问来源于stack exchange,提问作者user9371654
相关产品推荐
相关产品推荐

