繁体   English   中英

如何从Javascript中的电子邮件地址获取域?

[英]How to get domain from email address in Javascript?

我想用 Javascript 从电子邮件地址获取域部分。 很容易从电子邮件中提取域,例如通过split :“joe@example.com”,即example.com

但是,电子邮件也有类似“joe@subdomain1.example.com.uk”的形式,其中域是example.com.uk ,而不是subdomain1.example.com.uk 这里的问题是subdomain1可能被错误地视为域的一部分。

我如何可靠地做到这一点?

乍一看,这确实不是一个微不足道的问题。 幸运的是,有一些库可以解决这个问题, 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,它从它的域中知道它的子域,从它的国家代码中知道它的域。

请务必了解公共后缀列表网站上的列表,并了解它是基于志愿者工作,可能并不总是详尽无遗。

公共后缀列表是一项跨供应商计划,旨在提供准确的域名后缀列表,由 Mozilla 志愿者的辛勤工作和注册管理机构提交的内容维护,我们非常感谢他们。

由于没有并且仍然没有算法方法可以找到可以为特定顶级域注册域的最高级别(策略因每个注册机构而异),唯一的方法是创建一个列表。 这是公共后缀列表的目的。

我同意这个问题的最佳解决方案是使用一个库,就像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");

如果我弄错了,请挑战逻辑。

// 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);
        }


      }); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM