从 URL 中提取碱基 domain/eTLD+1
Extracting a base domain/eTLD+1 from a URL
我目前正在编写 WebExtension。在这个扩展中,我需要在 JS 中处理一堆 URL 并提取基本域(又名 eTLD+1)。
所以
www.cnn.com
=> cnn.com
cnn.com
=> cnn.com
www.world.cnn.com
=> cnn.com
www.bbc.co.uk
=> bbc.co.uk
- ...
正如您从示例中看到的那样,没有简单的技术可以提取所有内容。事实上,the official list 长约 12,000 行。
我知道浏览器可以在内部完成。我想知道在 JS 中是否有标准的方法可以做到这一点?
似乎没有任何 JavaScript API 但以下 Node 模块看起来可以解决问题:https://www.npmjs.com/package/publicsuffixlist
可能会迟到但是:
对于在浏览器中的使用,Raymond Hill(uBlock 原始作者)的 publicsuffixlist.js 实现效果很好,也可以选择使用 WASM 以获得更好的性能。
你还需要 punycode.js
简单用法(一旦你有 publicsuffix.min.js 和 punycode.js):
// at this point you have the publicsuffix list in a string
const publicSuffixList = "must contain list from https://publicsuffix.org/list/public_suffix_list.dat";
window.publicSuffixList.parse(publicSuffixList, punycode.toASCII);
// optionnal enable wasm : need that you serve the WASM file with MIME type
// "Content-Type: application/wasm"
window.publicSuffixList.enableWASM().then(status => {
console.log("WASM status: ", status);
});
const host = "www.bbc.co.uk";
const hostPuny = punycode.toASCII(host);
const domain = window.publicSuffixList.getDomain(hostPuny);
console.log("eTLD+1 : ", punycode.toUnicode(domain));
我目前正在编写 WebExtension。在这个扩展中,我需要在 JS 中处理一堆 URL 并提取基本域(又名 eTLD+1)。
所以
www.cnn.com
=>cnn.com
cnn.com
=>cnn.com
www.world.cnn.com
=>cnn.com
www.bbc.co.uk
=>bbc.co.uk
- ...
正如您从示例中看到的那样,没有简单的技术可以提取所有内容。事实上,the official list 长约 12,000 行。
我知道浏览器可以在内部完成。我想知道在 JS 中是否有标准的方法可以做到这一点?
似乎没有任何 JavaScript API 但以下 Node 模块看起来可以解决问题:https://www.npmjs.com/package/publicsuffixlist
可能会迟到但是:
对于在浏览器中的使用,Raymond Hill(uBlock 原始作者)的 publicsuffixlist.js 实现效果很好,也可以选择使用 WASM 以获得更好的性能。 你还需要 punycode.js
简单用法(一旦你有 publicsuffix.min.js 和 punycode.js):
// at this point you have the publicsuffix list in a string
const publicSuffixList = "must contain list from https://publicsuffix.org/list/public_suffix_list.dat";
window.publicSuffixList.parse(publicSuffixList, punycode.toASCII);
// optionnal enable wasm : need that you serve the WASM file with MIME type
// "Content-Type: application/wasm"
window.publicSuffixList.enableWASM().then(status => {
console.log("WASM status: ", status);
});
const host = "www.bbc.co.uk";
const hostPuny = punycode.toASCII(host);
const domain = window.publicSuffixList.getDomain(hostPuny);
console.log("eTLD+1 : ", punycode.toUnicode(domain));