js 获取网站的根域名

如:在 www.baidu.com获取 baidu.com

a.baidu.com 获取 baidu.com
可能有很多人没有明白我的意思,这的难点是不可能用正则获取匹配截取获取根域名的
比如www.a.china.com.cn你怎么知道截取的是china.com.cn呢??
所以我感觉应该有个域名库然后在匹配吧。

阅读 16.8k
6 个回答

把 host 按 . 分割,length 为 2,不用处理,大于 2 的去掉数组首位。

var hostArr = location.host.split('.')
hostArr.length === 2 ? hostArr.join('.') : hostArr.slice(1).join('.')

哦,不对。我没有考虑到三级域名...还是需要一个特征库匹配。

判断这个显然需要额外知识。

应该有个域名库然后在匹配吧 这个方向是对的。你想到的那个域名库叫做 public suffix list

www.a.china.com.cn中的.com.cn是一个public suffix,那么网站自己的部分就是下一级的 china.com.cn

document.location

里面有你想要的


function getLocation(){
    var arr = document.domain.split('.');
    if(arr.length === 2){
        return document.domain;
    }
    if(arr.length > 2 && arr[0] !== 'www'){
      return arr.slice(1).join('.')
    } 
    return arr.slice(1).join('.') 
}

如果用的是IP访问就有问题,三四级域名怎么办,要一个域名库了吗,哭死

正则表达式替换一下:

document.domain.match(/[^\.]+\.[^\.]+$/)[0]

貌似有问题,如果这样呢:

document.domain.replace(/^[^\.]+\./, "")

还是有问题,这样吧:

var arr = document.domain.match(/[^\.]+/g);
if(arr.length == 2)
    console.log(arr.join("."))
else if(arr.length >=3){
    arr.shift();
    console.log(arr.join("."))
}

不能直接获取啊,你获取当前链接然后截取吧。

function getLocation(href) {
    var match = href.match(/^(https?\:)\/\/(([^:\/?#]*)(?:\:([0-9]+))?)([\/]{0,1}[^?#]*)(\?[^#]*|)(#.*|)$/);
    return match && {
        protocol: match[1],
        host: match[2],
        hostname: match[3],
        port: match[4],
        pathname: match[5],
        search: match[6],
        hash: match[7]
    }
}
getLocation(document.location.href)

本来想偷懒找个数据的,看了上面的回答。。。.com.cn的情况自己想办法吧,反正我不会买这样的域名。?

/**
 * 根据host返回根域名
 * @param  {[string]} host [window.location.host]
 * @return {[string]}      [如果不是域名则返回IP]
 */
export let getDomain = (host) => {
  host = host.split(':')[0]
  return isNaN(host.substring(host.lastIndexOf('.'))) ? host.substring(host.substring(0, host.lastIndexOf('.')).lastIndexOf('.') + 1) : host
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题