使用JavaScript验证用逗号分隔的多个电子邮件地址

8
我想要验证一个字符串,该字符串可以是电子邮件或由逗号分隔的多个电子邮件。
例如: bill.gates@hotmail.com -> TRUE bill -> FALSE bill.gates@microsoft.com,steve.jobs@apple.com" -> TRUE bill.gates@microsoft.com,steve.jobs@apple.com, bob" -> false bob,bill.gates@microsoft.com,steve.jobs@apple.com" -> false
我编写了下面的代码,可以通过测试用例。
function validateEmail(field) {
    var regex=/\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b/i;
    return (regex.test(field)) ? true : false;
}

function validateMultipleEmailsCommaSeparated(value) {
    var result = value.split(",");
    for(var i = 0;i < result.length;i++)
    if(!validateEmail(result[i])) 
            return false;           
    return true;
}

这是最快的方法吗?如果我想允许使用分号和逗号作为分隔符怎么办?

10个回答

9

不应该使用[A-Z]{2,4}来匹配顶级域名:

那么.museum.travel呢?IDNA域名如.xn--0zwm56d.xn--11b5bs3a9aj6g呢?

此外,像"John Doe"@example.org这样的电子邮件地址是完全有效的。

在我看来,你只需要在客户端检查地址是否包含一个@,并且在它之后至少有一个.。在服务器端,您可以检查服务器是否存在(您甚至可能想尝试连接到适当的SMTP端口),或者只需发送验证邮件即可。

其他所有内容都容易出错,因为实际用于检查有效电子邮件地址的正则表达式看起来像这样


还有这个

return (regex.test(field)) ? true : false;

这真是令人费解 - test() 已经返回了一个布尔值!


如果你想允许不同的分隔符,使用正则表达式来代替字符串进行分割,例如:

value.split(/,|;/)

建议修改:“...你应该在客户端检查的是地址中是否只包含一个@符号…”(但是,我假设本地部分不允许使用“@”符号?) - Kristen
2
@Kristen:在引用的字符串中允许使用'@'符号,但只有在那里。虽然引用的字符串可能会为垃圾邮件机器人提供一种容易混淆的方式,但我从未见过其被实际应用。此外,还应该记住,以下字符即使没有引用也是合法的:!#$%&'*+-/=?^_`{|}~。 - Christoph
顺便说一句,我记得曾经有人在“@”后面使用原始ccTLD域的邮件地址;不过我不记得是哪个国家了... - Christoph

3
使用var result = value.split(","),你将得到一个数组。

2

正则表达式:

((\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*)*([,])*)*

这个正则表达式跳过了以下情况: test@test.com,你有其他的解决方案吗?它对test@test.comtest1@test.com工作得很好。 - Varinder Sohal

1
let emails = 'test@gmail.com, test2@gmail.com';

很简单。你只需要用逗号来分割数组。
使用以下方法:
const arrayOfEmail = emails.split(',');

那么你需要使用正则表达式对字符串进行验证,
const pattern = /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i;

// Make common function for check single array pattern
export const validateEmailByString = (email: string) => {
  const emailId = email.replace(/(\r\n|\n|\r| )/gm, ''); // remove blank spaces and new line breaks from string.
  return emailPattern.test(emailId);
}

那么您只需使用以下方式检查电子邮件:

const isAllEmailValid = arrayOfEmail.every(validateEmailByString);

谢谢。

1
通常情况下,验证电子邮件地址是不可能的。语法上正确并不一定意味着该地址真实存在。即使存在,也不能保证接收者会阅读它。
即便如此,涵盖所有符合适用RFC(请求评论)标准的语法正确的地址需要使用极其复杂的正则表达式(参见Friedl, O'Reilly的第一版 "Mastering Regular Expressions" 中的 4724 或 6598 个字符版本,而这些可能无法处理IDN)。例如,单引号在本地部分中是一个有效字符,而电子邮件中还可以包含注释。

0

试一下这个

     function validateEmails(string) {
        var regex = /^([\w-\.]+@([\w-]+\.)+[\w-]{2,4})?$/;
        var result = string.replace(/\s/g, "").split(/,|;/);        
        for(var i = 0;i < result.length;i++) {
            if(!regex.test(result[i])) {
                return false;
            }
        }       
        return true;
    }

接受逗号和分号作为分隔符,如果您只想使用逗号作为分隔符,请更改设置。


0
我使用了validationEngine和underscore.js来完成这个任务:
function validateEmail(field, rules, i, options) {
if (!_.all(field.val().split(","), function(candidate) { return $.trim(candidate).match(options.allrules.email.regex); } ))
    return options.allrules.email.alertText;
}

然后用以下方式装饰我的表单字段:

<input class="validate[required,funcCall[validateEmail]]" type="text" name="contact_email" id="contact_email" value=""  />

0

用于 PHP preg_match_all() 函数

$pattern = '/([\w+\._%-]+@[\w+\.-]+\.[\w+]{2,4}[^,;\s])/';
$text = 'abc@efg.com, efg, hij@emg.com, ak@efg asfbd@efg.com ab@sdfs.com abc+efg@pqr.com';
preg_match_all($pattern, $text, $match);
var_dump($match);

array(2) {
  [0] =>
  array(5) {
    [0] =>
    string(11) "abc@efg.com"
    [1] =>
    string(11) "hij@emg.com"
    [2] =>
    string(13) "asfbd@efg.com"
    [3] =>
    string(11) "ab@sdfs.com"
    [4] =>
    string(15) "abc+efg@pqr.com"
  }
  [1] =>
  array(5) {
    [0] =>
    string(11) "abc@efg.com"
    [1] =>
    string(11) "hij@emg.com"
    [2] =>
    string(13) "asfbd@efg.com"
    [3] =>
    string(11) "ab@sdfs.com"
    [4] =>
    string(15) "abc+efg@pqr.com"
  }
}


0
如何将字符串拆分为数组,并循环遍历,每次只传递一个电子邮件地址?

0

我会在validateMultipleEmailsCommaSeparated函数中加入$.trim(result[i]),因为很多人在逗号后面添加了空格。

当然,这是jQuery的东西,你可以用你自己的方式实现相同的功能。


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