【问题标题】:Validate a comma separated email list验证逗号分隔的电子邮件列表
【发布时间】:2014-05-21 07:51:01
【问题描述】:

我正在尝试使用正则表达式来验证逗号分隔的电子邮件列表。

我想首先验证完整列表,然后拆分(“;”),然后从拆分中修剪每个数组值(每封电子邮件)。

我想验证以下表达式:

EMAIL,EMAIL  --> Ok
EMAIL, EMAIL  --> Ok
EMAIL , EMAIL  --> Ok
EMAIL , , EMAIL  --> Wrong
EMAIL , notAnEmail , EMAIL  --> Wrong

我知道验证电子邮件有很多复杂的表达式,但我不需要任何花哨的东西,这对我有用:/\S+@\S+\.\S+/;

我想要简单的 JS,而不是 jQuery。谢谢。

编辑:我已经考虑过先验证然后拆分,但是使用到目前为止我尝试过的表达式,这将被验证为两封正确的电子邮件:

EMAIL, EMAIL  .  EMAIL

我想像验证每封电子邮件一样验证列表本身。

【问题讨论】:

  • 为什么要先验证,然后拆分?拆分然后循环浏览每封电子邮件会容易得多。
  • 如果拆分,第二封邮件将无效。类似于email1@gmail.com . email2@gmail.com。当您使用我提供的正则表达式时,这不会验证。
  • EMAIL 和 email@email.com 不是可比较的字符串。

标签: javascript regex validation email


【解决方案1】:

一种更简单的方法是先删除空格并拆分字符串:

var emails = emailList.replace(/\s/g,'').split(",");

这将创建一个数组。然后,您可以遍历数组并检查元素是否不为空且是否为有效的电子邮件地址。

var valid = true;
var regex = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;

for (var i = 0; i < emails.length; i++) {
     if( emails[i] == "" || ! regex.test(emails[i])){
         valid = false;
     }
}

注意:我得到了正则表达式 from here

【讨论】:

  • 它不验证列表。当我验证数组拆分结果时,它也不会验证“EMAIL,EMAIL,EMAIL”。
  • 应该,您要验证的列表是什么样的?
  • @user2256799,您可以在将字符串拆分为数组之前调用replace() 安全地删除空格。 "foo@bar.com, pow@wow.com".replace(" ", "").split(",");
  • @Flowpoke 将使用 .replace(/\s/g,'') 删除字符串中的所有空格,然后进行拆分。效果很好。
【解决方案2】:

我多年来一直在使用正则表达式,并且代码是相同的。 我相信这对每个人都有效:

^(\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]{2,4}\s*?,?\s*?)+$

要开心:)

【讨论】:

  • 您在哪里看到 TLD 限制为 4 个字符?另请参阅iana.org/domains/root/db,查看en.wikipedia.org/wiki/Email_address#Examples 以查看您的正则表达式未涵盖的一些有效电子邮件。
  • @Toto - 我们主要使用 .com、.org、.inc、.co.aus 等。因此,如果有人想根据他的域进行更改,我推荐 4,否则完美我的工作从未遇到任何问题。
【解决方案3】:

还要注意,您需要去掉多余的空格,因此需要添加一个额外的步骤,如下所示:

var emailStr = "felipe@google.com   , felipe2@google.com, emanuel@google.com\n";


function validateEmailList(raw){
    var emails = raw.split(',')


    var valid = true;
    var regex = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;

    for (var i = 0; i < emails.length; i++) {
        if( emails[i] === "" || !regex.test(emails[i].replace(/\s/g, ""))){
            valid = false;
        }
    }
    return valid;
}


console.log(validateEmailList(emailStr))

通过添加.replace(/\s/g, ""),您可以确保删除所有空格,包括新行和制表符。样本的结果是正确的,因为我们正在摆脱所有空格。

【讨论】:

    【解决方案4】:

    我同意@crisbeto 的评论,但如果您确定这是您想要的方式,您可以通过匹配以下正则表达式来实现:

    ^(\s?[^\s,]+@[^\s,]+\.[^\s,]+\s?,)*(\s?[^\s,]+@[^\s,]+\.[^\s,]+)$

    【讨论】:

    【解决方案5】:

    const regExp = new RegExp(/^(\s?[^\s,]+@[^\s,]+\.[^\s,]+\s?,)*(\s?[^\s,]+@[^\s,]+\.[^\s,]+)$/);
    const dom = document.getElementById("regExDom");
    const result = regExp.test("test@gmail.com,test2@gmail.com,test3@test.com")
    console.log("Regex test => ", result)
    dom.innerHTML = result;
    &lt;div id="regExDom"&gt;&lt;/div&gt;

    【讨论】:

    • 这个字符串 test.test@gmail, test 失败了,许多无效字符串也失败了
    猜你喜欢
    • 2018-09-15
    • 2015-07-14
    • 2011-09-13
    • 2017-06-10
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-22
    相关资源
    最近更新 更多