如何编写正则表达式从URL中提取主域名(domain.extension)?
提取URL中的主域名(含后缀)解决方案
嘿,刚好能帮你搞定这个问题!之前的正则只能去掉www.开头的前缀,但要去掉所有子域名(不管是几层),只留下domainname.extension,我们可以调整正则来实现。
基础通用方案(适配大多数常见后缀)
这个方案能处理像abc.def.test.com、ghi.test.com、www.example.org这类域名,直接提取最后两段作为主域名:
// 和你之前的代码风格一致的直接替换写法 const mainDomain = window.location.hostname.replace(/^.*?([^.]+\.[^.]+)$/, '$1'); // 封装成函数更方便复用 const getMainDomain = (hostname) => { return hostname.replace(/^.*?([^.]+\.[^.]+)$/, '$1'); }; // 测试示例 console.log(getMainDomain('abc.def.test.com')); // 输出 "test.com" console.log(getMainDomain('ghi.test.com')); // 输出 "test.com" console.log(getMainDomain('www.example.org')); // 输出 "example.org"
正则解释:
^.*?:非贪婪匹配域名开头的所有内容(也就是所有子域名层级,比如abc.def.、ghi.、www.)([^.]+\.[^.]+):捕获最后两个由点分隔的部分,[^.]+表示匹配任意非点的字符,也就是主域名和后缀$:匹配字符串结尾,确保我们只取最后两段
进阶方案(适配多段后缀,如.co.uk、.com.au)
如果你的业务需要处理像bbc.co.uk、google.com.au这类多段后缀的域名,上面的基础方案会提取成co.uk,这显然不对。我们可以调整正则,针对常见的多段后缀做适配:
const getMainDomain = (hostname) => { // 匹配最后两到三段,覆盖常见多段后缀 return hostname.replace(/^.*?([^.]+\.(?:co|com|org|net|edu|gov|ac|co\.uk|com\.au|org\.uk))$/, '$1'); }; // 测试示例 console.log(getMainDomain('bbc.co.uk')); // 输出 "bbc.co.uk" console.log(getMainDomain('shop.com.au')); // 输出 "shop.com.au" console.log(getMainDomain('blog.test.org')); // 输出 "test.org"
说明:
这个方案需要你根据业务中遇到的多段后缀,手动补充到正则里的(?:...)部分。如果需要覆盖所有可能的公共后缀,前端场景下可以考虑引入公共后缀列表库,但如果只是常规需求,手动维护常见后缀就足够了。
内容的提问来源于stack exchange,提问作者DShultz
相关产品推荐
相关产品推荐

