我想通过Javascript从电子邮件地址获取域名部分。通过电子邮件(例如split
:" joe@example.com" ;, example.com
即可轻松提取域名。
但是,电子邮件的格式也类似于" joe@subdomain1.example.com.uk" ;,其中域名为example.com.uk
,而不是subdomain1.example.com.uk
。这里的问题是subdomain1
可能被错误地视为域的一部分。
我如何可靠地做到这一点?
答案 0 :(得分:4)
这真的不是一个微不足道的问题,因为乍一看似乎是这样。 幸运的是有一些解决这个问题的库,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: '' }
*/
从电子邮件地址中提取服务器地址部分,首先按{/ 1}}字符分割
@
有关问题解决方案的详细深入讨论,请查看类似python库的README。
另一方面,tldextract知道所有gTLD和ccTLD的外观 根据公共后缀查找当前生活的人 清单(PSL)。因此,给定一个URL,它知道其域中的子域, 及其域名来自国家代码。
请务必了解公开后缀列表website上的列表,并了解它基于志愿者工作,并且可能并非详尽无遗。
公共后缀列表是一个跨供应商提供的 准确的域名后缀列表,由辛勤工作维护 Mozilla志愿者和我们所在的注册管理机构提交的意见书 非常感激。
因为现在并且仍然没有找到算法的算法 域名可以为特定域名注册的最高级别 顶级域(策略因每个注册表而异),唯一 方法是创建一个列表。这是公共后缀列表的目标。
答案 1 :(得分:0)
我同意这个问题的最佳解决方案是使用库,就像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");

如果我弄错了,请挑战逻辑。
答案 2 :(得分:-2)
// 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);
}
});