首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Javascript中从电子邮件地址获取域名?

如何在Javascript中从电子邮件地址获取域名?
EN

Stack Overflow用户
提问于 2018-04-18 14:45:53
回答 3查看 14.7K关注 0票数 10

我想从一个电子邮件地址,在Javascript的域名部分。从电子邮件中提取域名很容易,比如通过split:"joe@example.com",也就是example.com

然而,电子邮件也有像"joe@subdomain1.example.com.uk“这样的形式,其域名是example.com.uk,而不是subdomain1.example.com.uk。这里的问题是,subdomain1可能被错误地认为是域的一部分。

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

EN

回答 3

Stack Overflow用户

发布于 2018-04-18 15:06:49

乍一看,这确实不是一个微不足道的问题。幸运的是,有一些库可以解决这个问题,tld-extract是一个流行的选择,它使用了Mozilla的公共后缀列表(一个基于志愿者的列表)。用法是

代码语言:javascript
复制
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: '' }
*/

要从电子邮件地址中提取服务器地址部分,请先按@字符拆分,如下所示

代码语言:javascript
复制
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志愿者的辛勤工作和注册机构的提交维护,我们非常感谢他们。

由于过去和现在都没有算法方法来查找可以为特定顶级域注册的域的最高级别(每个注册中心的策略不同),因此唯一的方法是创建一个列表。这就是公共后缀列表的目的。

票数 10
EN

Stack Overflow用户

发布于 2018-04-18 15:41:57

我同意这个问题的最佳解决方案是使用库,就像https://stackoverflow.com/a/49893282/2735286中建议的那样。

然而,如果你有一个足够长的顶级域名和子域列表,你可以写一些代码来提取'@‘符号后面的任何字符,然后从域名中找出你是否有一个顶级域名或子域。当你知道你正在处理一个顶级域名时,你就知道在哪里可以找到主域名,所以在它之前的所有东西都必须是一个子域。这同样适用于子域。

这是一个天真的实现,但您可以尝试这样做:

代码语言:javascript
复制
// 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");

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

票数 1
EN

Stack Overflow用户

发布于 2018-04-18 15:27:11

代码语言:javascript
复制
// 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);
        }


      }); 
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49892932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档