我想从一个电子邮件地址,在Javascript的域名部分。从电子邮件中提取域名很容易,比如通过split:"joe@example.com",也就是example.com。
然而,电子邮件也有像"joe@subdomain1.example.com.uk“这样的形式,其域名是example.com.uk,而不是subdomain1.example.com.uk。这里的问题是,subdomain1可能被错误地认为是域的一部分。
我该如何可靠地做到这一点呢?
发布于 2018-04-18 15:06:49
乍一看,这确实不是一个微不足道的问题。幸运的是,有一些库可以解决这个问题,tld-extract是一个流行的选择,它使用了Mozilla的公共后缀列表(一个基于志愿者的列表)。用法是
var parser = require('tld-extract');
console.log( parser("www.google.com") );
console.log( parser("google.co.uk") );
/**
* >> { tld: 'com', domain: 'google.com', sub: 'www' }
* >> { tld: 'co.uk', domain: 'google.co.uk', sub: '' }
*/要从电子邮件地址中提取服务器地址部分,请先按@字符拆分,如下所示
const email = "john@sub.domain.com"
const address = email.split('@').pop()
const domain = parser(address).domain有关问题解决方案的更深入讨论,请查看类似python库的README。
另一方面,
tldextract通过根据公共后缀列表(PSL)查找当前存活的gTLD和ccTLD,从而了解所有gTLD和ccTLD的外观。因此,给定一个URL,它就可以知道它的子域与它的域,以及它的域与它的国家代码。
确保了解公共后缀列表website上的列表,并了解它是基于志愿者工作的,可能在任何时候都不是详尽的。
公共后缀列表是一个跨供应商的倡议,它提供了一个准确的域名后缀列表,由Mozilla志愿者的辛勤工作和注册机构的提交维护,我们非常感谢他们。
由于过去和现在都没有算法方法来查找可以为特定顶级域注册的域的最高级别(每个注册中心的策略不同),因此唯一的方法是创建一个列表。这就是公共后缀列表的目的。
发布于 2018-04-18 15:41:57
我同意这个问题的最佳解决方案是使用库,就像https://stackoverflow.com/a/49893282/2735286中建议的那样。
然而,如果你有一个足够长的顶级域名和子域列表,你可以写一些代码来提取'@‘符号后面的任何字符,然后从域名中找出你是否有一个顶级域名或子域。当你知道你正在处理一个顶级域名时,你就知道在哪里可以找到主域名,所以在它之前的所有东西都必须是一个子域。这同样适用于子域。
这是一个天真的实现,但您可以尝试这样做:
// TODO: needs to have an exhaustive list of top level domains
const topLevelDomains = ["com", "org", "int", "gov", "edu", "net", "mil"];
// TODO: Needs an exhaustive list of subdomains
const subdomains = ["co.uk", "org.uk", "me.uk", "ltd.uk", "plc.uk"];
function extract(str) {
const suffix = str.match(/.+@(.+)/);
if (suffix) {
const groups = suffix.pop().split(".");
const lastPart = groups[groups.length - 1];
if (isSubDomain(groups[groups.length - 2] + "." + lastPart)) {
console.log("Sub domain detected in: " + groups);
if (groups.length > 3) {
console.log("Possible subdomain: " + groups.splice(0, groups.length - 3));
console.log();
}
} else if (isTopLevelDomain(lastPart)) {
console.log("Top level domain detected in: " + groups);
if (groups.length > 2) {
console.log("Possible subdomain: " + groups.splice(0, groups.length - 2));
console.log();
}
}
}
}
function isTopLevelDomain(lastPart) {
return (topLevelDomains.find(s => s === lastPart));
}
function isSubDomain(lastPart) {
return (subdomains.find(s => s === lastPart));
}
extract("joe@example.com");
extract("joe@subdomain1.example.co.uk");
extract("joe@subdomain2.example.edu");
extract("joe@subdomain3.example.ltd.uk");
extract("joe@test.subdomain3.example.plc.uk");
如果我弄错了,请挑战一下逻辑。
发布于 2018-04-18 15:27:11
// Not a proper solution because of email pattern is not fixed. Use below if it is appropriate solution according to your problem .
jQuery( document ).ready(function() {
//var input = 'joe@subdomain1.com';
var input = 'joe@subdomain1.example.com.uk';
var first_split = input.split("@")[1];
var second_split = first_split.split(".");
if(second_split.length == 2) {
console.log('domain is : '+first_split);
} else if(second_split.length > 2) {
var str = first_split.substring(first_split.indexOf(".") + 1);
console.log('domain is : '+str);
}
}); https://stackoverflow.com/questions/49892932
复制相似问题