使用JavaScript验证多个电子邮件地址

7

我有以下两个函数:

validateEmail: function(value) {
    var regex = /^([\w-\.]+@([\w-]+\.)+[\w-]{2,4})?$/;
return (regex.test(value)) ? true : false;
}

validateEmails: function(string) {

    var self = shareEmail;
    var result = string.replace(/\s/g, "").split(/,|;/);

        for(var i = 0;i < result.length;i++) {
            if(!self.validateEmail(result[i])) {
                return false;
            } else {               
            return true;
        }
    }
}

问题在于当我像这样测试电子邮件 if(!self.validateEmails(multipleEmails)) { 我只能根据字符串中的第一个电子邮件得到 true 或 false,但我希望能够测试字符串中的任何电子邮件。
谢谢!

多个邮箱地址包含在哪里? - Julien Fouilhé
正则表达式中的 ^$ 用于匹配整个字符串。请访问 http://www.regular-expressions.info/reference.html 了解更多关于正则表达式的内容。 - Markus Hedlund
@Bartimeus 这是一个文本输入框的值...基本上是一个由逗号或分号分隔的电子邮件字符串。 - Adrian Florescu
@Znarkus 我正在使用分割函数将每个电子邮件地址分开,并对每个地址进行测试。 - Adrian Florescu
@FlorescuAdrian 哦,现在我明白了。下面的答案应该能解决你的问题。 - Markus Hedlund
如果所有电子邮件都正常,您是否希望返回“true”,还是只要有一个电子邮件正常就可以? - Beetroot-Beetroot
5个回答

12
问题出在你的if/else块上;你在两种情况下都使用了return,这就意味着它在只评估一个元素后就离开了函数。
我修改了validateEmails函数以演示你可能想要做的事情:
validateEmail: function(value) {
    var regex = /^([\w-\.]+@([\w-]+\.)+[\w-]{2,4})?$/;
    return (regex.test(value)) ? true : false;
}

validateEmails: function(string) {
    var self = shareEmail;
    var result = string.replace(/\s/g, "").split(/,|;/);

    for(var i = 0;i < result.length;i++) {
        if(!self.validateEmail(result[i])) {
            return false;
        }
    }

    return true;
}

我怎么可能没看到它... x) - Julien Fouilhé
1
@Gustonez 解决了我的问题,因为当 if 语句到达无效的电子邮件时,它会退出该函数。这正是我想要的,但我也喜欢你的解决方案,因为它还显示了错误的电子邮件。 - Adrian Florescu
当我编写正则表达式字符串时,它在"@([\w-]+.)"这部分中出现错误,提示无效的表达式项'['。 - Utpal
嗨 @Lucas Green,你能在 fiddle 中更新你的答案吗?这对其他人非常有用。 - jvk

2

这个怎么样?

validateEmails: function(string) {

    var self = shareEmail;
    var result = string.replace(/\s/g, "").split(/,|;/);
    var errors = [];
    for(var i = 0;i < result.length;i++) {
        if(!self.validateEmail(result[i])) {
            errors[i] = result[i] + ' is not valid.';
        }
     }
     if (errors.length > 0) {
        alert(errors.join('\n'));
        return false;
     } else {
         return true;
     }

}

2

如果您使用jquery-validate,验证方法应如下:

jQuery.validator.addMethod("separated_emails", function(value, element) {
    if (this.optional(element)) {
        return true;
    }

    var mails = value.split(/,|;/);
    for(var i = 0; i < mails.length; i++) {
        // taken from the jquery validation internals
        if (!/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(mails[i])) {
            return false;
        }
    }

    return true;
}, "Please specify a email address or a comma separated list of addresses");

正是我所需要的,尽管我使用了不同的正则表达式来提高无效电子邮件的覆盖范围:/^(([A-Za-z0-9]+_+)|([A-Za-z0-9]+\-+)|([A-Za-z0-9]+\.+)|([A-Za-z0-9]+\++))*[A-Za-z0-9]+@((\w+\-+)|(\w+\.))*\w{1,63}\.[a-zA-Z]{2,6}$/ - mikhail-t
@mik-t,你能把你的答案粘贴到fiddle中吗?这会对其他人有所帮助。 - jvk
@whoami 这个问题可能应该向 staabm 提出,我只是使用了上面的解决方案,尽管使用了不同的正则表达式。 - mikhail-t
我最初使用的是W3C推荐的那个。 - staabm

1
我认为最易维护的方法是使用一个变量来存储返回输出。
validateEmail: function(value) {
    var regex = /^([\w-\.]+@([\w-]+\.)+[\w-]{2,4})?$/;
return (regex.test(value)) ? true : false;
}

validateEmails: function(string) {

var self = shareEmail;
var result = string.replace(/\s/g, "").split(/,|;/);
var allOk = true;


    for(var i = 0;i < result.length;i++) {
        if(!self.validateEmail(result[i])) {
            allOk = false;
        } 
    }

return allOk;
}

0
以下代码非常适合使用 JQuery 验证以逗号或分号分隔的多个电子邮件地址:
   var emailReg = new RegExp(/^([A-Z0-9.%+-]+@@[A-Z0-9.-]+.[A-Z]{2,6})*([,;][\s]*([A-Z0-9.%+-]+@@[A-Z0-9.-]+.[A-Z]{2,6}))*$/i);
      var emailText = $('#email').val();
      if (!emailReg.test(emailText)) {
          alert('Wrong Email Address\Addresses format! Please reEnter correct format');
            return false;
        }

你的回答没有针对OP的具体问题作出回应。 - dakab

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接