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

时间:2018-04-18 06:45:53

标签: javascript

我想通过Javascript从电子邮件地址获取域名部分。通过电子邮件(例如split:" joe@example.com" ;, example.com即可轻松提取域名。

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

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

3 个答案:

答案 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);
        }


      });