如何通过白名单域名正则表达式验证电子邮件

时间:2019-01-08 08:08:00

标签: javascript regex

我想通过白名单来验证域,例如:.com,.co.id,.org

这里我有一个正则表达式模式:

/^[_a-z0-9-]+(\.[_a-z0-9-]+)*(\+[a-z0-9-]+)?@[a-z0-9-]+(\.[a-z0-9-]+)*$/i;

因此,如果用户输入:

  • example@example.gov-> 无效
  • example@example.com-> 有效

有人可以帮助我吗? 谢谢

2 个答案:

答案 0 :(得分:2)

尝试

let e = ["example@example.gov",
         "example@example.com",
         "example@example.co.id",
         "example@example.org"];

let d = [".com", ".co.id", ".org"];

let f = x=> d.some(y => new RegExp(`@.*?(${y})`).test(x));

let v = e.filter(x=> f(x));

console.log(v);     // show valid emails

正则表达式的

说明 ::与@之后第一个点后的字母匹配。首先,我们通过.*?以非贪婪的方式获取@之后的任何字符,然后在第一个点(之前打开组\.,并检查所有剩余字符是否为域${y})。 / p>

答案 1 :(得分:2)

您可以分两步进行:

function validateEmail(email) {
   
    //check that the input string is an well formed email 
    var emailFilter = /^([a-zA-Z0-9_.-])+@(([a-zA-Z0-9-])+.)+([a-zA-Z0-9]{2,4})+$/;
    if (!emailFilter.test(email)) {
        return false;
    }

    //check that the input email is in the whitelist
    var s, domainWhitelist = [".com", "co.id", ".org"];
    for (s of domainWhitelist)
      if(email.endsWith(s))
        return true;
    
    //if we reach this point it means that the email is well formed but not in the whitelist
    return false;
}

console.log("validate ->" + validateEmail(""));
console.log("validate abc ->" + validateEmail("abc"));
console.log("validate example@example.gov ->" + validateEmail("example@example.gov"));
console.log("validate example@example.com ->" + validateEmail("example@example.com"));