Javascript 如何提取根域

Javascript 如何提取根域,javascript,Javascript,我使用以下公式提取根域: =regexextract(regexreplace(regexreplace(A1, "^[^/]//", ""), "/.$", ""), "[^.]+.[^.]+$") 但是,每当我输入带有附加扩展名的URL时,如www.countryandtownhouse.co.uk 结果将返回co.uk,而不是返回countryandtownhouse.co.uk 我该如何

我使用以下公式提取根域:

=regexextract(regexreplace(regexreplace(A1, "^[^/]//", ""), "/.$", ""), "[^.]+.[^.]+$")
但是,每当我输入带有附加扩展名的URL时,如
www.countryandtownhouse.co.uk

结果将返回
co.uk
,而不是返回
countryandtownhouse.co.uk


我该如何解决这个问题?非常感谢。:)

不幸的是,这实际上只可能使用来自的ETLD列表,该列表会定期更改。你要做的(看起来)是确定完整主机名中的级别,它使你成为该站点内容的最终提供者。你不能仅仅通过文本处理来做到这一点,因为正如你所看到的,点的数量并不能帮助你做到这一点。除了可以注册域的级别不同之外(可以注册
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。但它比这更进一步:一些公司(不是注册商)允许人们在他们的域上使用子域(例如:
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuugithub.io
\uuuuuuuuuuuuuuuuuu

这就是为什么存在公共后缀列表,因此浏览器可以识别确定控制实体的点,以便在地址栏中显示标识信息、限制cookie等

因此,要对给定主机名执行此操作,您需要:

  • 下载列表(酌情缓存);您可能需要将其缓存在服务器上或使用某种代理,因为列表没有提供CORS头
  • 确定适用的最大长度后缀(在本例中为
    .co.uk
  • 将后缀加上一级:
    countryandtownhouse.co.uk
  • 实例:

    let list=null;
    设btn=document.getElementById(“btn检查”);
    设txt=document.getElementById(“txt主机名”);
    btn.disabled=true;
    日志(“加载列表…”);
    getPublicsSufflexlist()
    .然后(()=>{
    log(“已获取列表;准备查找根”);
    btn.addEventListener(“单击”,()=>{
    让hostname=txt.value;
    让index=hostname.indexOf(“/”);
    如果(索引!=-1){
    hostname=hostname.substring(索引+2);
    }
    index=hostname.indexOf(“/”);
    如果(索引!=-1){
    hostname=hostname.substring(0,索引);
    }
    showRoot(主机名);
    });
    btn.disabled=false;
    })
    .catch(错误=>{
    控制台错误(error);
    });
    函数getPublicSuffixList(){
    //注意:在任何地方使用cors纯粹是为了演示
    //堆栈溢出的代码。不要在生产中使用它!!!!
    返回取回(“https://cors-anywhere.herokuapp.com/https://publicsuffix.org/list/public_suffix_list.dat")
    。然后(res=>{
    如果(!res.ok){
    抛出新错误(“HTTP错误”+res.status);
    }
    返回res.text();
    })
    。然后(数据=>
    //把它分成几行
    data.split(/\r?\n/)
    //在数据行中添加点,将注释和空格转换为空
    .map(行=>{
    line=line.trim();
    返回(line&!line.startsWith(“/”)`.${line}`:null;
    })
    //过滤掉空值
    .filter(布尔值)
    //先排序
    .sort((a,b)=>b.length-a.length)
    );
    }
    函数findRoot(主机名){
    for(列表的常量输入){
    if(hostname.endsWith(条目)){
    //找到后缀,找出要保留的段数(注意:因为我们添加了一个`)`
    //在列表条目的开头,它与
    //我们匹配的条目中的段
    const segmentCount=条目的分割(“.”长度;
    //获取此主机名的段
    const segments=hostname.split(“.”);
    //只归还我们需要的
    返回segments.slice(-segmentCount).join(“.”);
    }
    }
    返回null;
    }
    函数showRoot(主机名){
    const root=findRoot(主机名);
    log(`${hostname}=>${root}`);
    }
    (异步()=>{
    list=wait getPublicSufflexlist();
    log(findRootDomain(“www.countryandtownhouse.co.uk”);
    })();
    
    要尝试的示例:

    • www.countryandtownhouse.co.uk
    • www.foo.github.io
    • foo.github.io

    请看一看供参考的“附加扩展”称为顶级域您如何定义“根域”?像
    mail.google.com
    someuser.github.io
    这样的情况如何?在编写代码之前,您需要一个更好的定义。
    窗口。location
    对象包含诸如,
    host
    origin
    hostname
    等值。要理解或检查,您只需在浏览器中对其进行控制台操作。@Zain&Jordi-位置如何帮助解决这个问题?它只会告诉您主机是
    www.countryandtownhouse.co.uk
    ,而不是其中的哪一部分是“根域”(OP想要使用的任何定义)。