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想要使用的任何定义)。