Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/429.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
验证多封用javascript逗号分隔的电子邮件_Javascript_Regex - Fatal编程技术网

验证多封用javascript逗号分隔的电子邮件

验证多封用javascript逗号分隔的电子邮件,javascript,regex,Javascript,Regex,我想验证一个字符串,它可以是一封电子邮件,也可以是多封用逗号分隔的电子邮件 例如: 比尔。gates@hotmail.com->正确 票据->假 账单。gates@microsoft.com史蒂夫。jobs@apple.com“->正确 账单。gates@microsoft.com史蒂夫。jobs@apple.com,bob“->false 鲍勃,比尔。gates@microsoft.com史蒂夫。jobs@apple.com“->错 我提出了下一个与测试用例一起工作的代码 function v

我想验证一个字符串,它可以是一封电子邮件,也可以是多封用逗号分隔的电子邮件

例如:

比尔。gates@hotmail.com->正确
票据->假
账单。gates@microsoft.com史蒂夫。jobs@apple.com“->正确
账单。gates@microsoft.com史蒂夫。jobs@apple.com,bob“->false
鲍勃,比尔。gates@microsoft.com史蒂夫。jobs@apple.com“->错

我提出了下一个与测试用例一起工作的代码

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;
}
功能验证邮件(字段){
var regex=/\b[A-Z0-9.\uz0%+-]+@[A-Z0-9.-]+\[A-Z]{2,4}\b/i;
返回(正则表达式测试(字段))?真:假;
}
函数validateMultipleEmailsCommamSeparated(值){
var结果=值。拆分(“,”);
for(变量i=0;i

这是最快的方法吗?如果我想允许;并且,作为分隔符呢?

如何将字符串拆分成一个数组,然后一次只通过一个电子邮件地址在其中循环?

使用
var result=value.split(“,”)
。你最终得到一个数组。

你不应该将顶级域与
[a-Z]{2,4}匹配

那么
.museum
旅行
呢?像
.xn--0zwm56d
.xn--11b5bs3a9aj6g
这样的IDNA域名呢

此外,有一个像
“johndoe”@example.org
这样的电子邮件地址也是非常有效的

在我看来,您应该在客户端检查地址是否包含
@
,以及地址后面是否至少有一个
。在服务器端,您可以检查服务器是否存在(您甚至可能想尝试连接到适当的SMTP端口),或者发送验证邮件

其他一切都容易出错,因为实际的正则表达式检查有效的电子邮件地址


还有这个

return (regex.test(field)) ? true : false;
是一个严重的WTF-
test()
已返回布尔值


如果希望允许使用不同的分隔符,请使用正则表达式而不是字符串进行拆分,例如

value.split(/,|;/)
一般来说,验证电子邮件地址是不可能的。语法上有效的东西不一定去任何地方,即使去了也不一定会被读取

即使如此,覆盖所有可能的语法正确地址(根据适用的RFC)需要一个极其复杂的正则表达式(参见第一版的“掌握正则表达式”(Friedl,O'Reilly)以了解4724或6598字符版本,这些可能不处理IDN)例如,撇号在本地部分是有效字符,您可以在电子邮件中发表评论。

Regex:

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

我使用validationEngine和underline.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=""  />

我会在
validateMultipleEmailsCommaseSeparated
函数中加入
$.trim(结果[I])
,因为很多人会在逗号后添加空格


当然,这是一个jQuery问题,所以按照您的方式做同样的事情。

将此用于php preg\u match\u all()

数组(2){
[0] =>
阵列(5){
[0] =>
字符串(11)”abc@efg.com"
[1] =>
字符串(11)”hij@emg.com"
[2] =>
字符串(13)”asfbd@efg.com"
[3] =>
字符串(11)”ab@sdfs.com"
[4] =>
字符串(15)“abc+efg@pqr.com"
}
[1] =>
阵列(5){
[0] =>
字符串(11)”abc@efg.com"
[1] =>
字符串(11)”hij@emg.com"
[2] =>
字符串(13)”asfbd@efg.com"
[3] =>
字符串(11)”ab@sdfs.com"
[4] =>
字符串(15)“abc+efg@pqr.com"
}
}
试试这个

     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;
    }
函数validateEmails(字符串){
var regex=/^([\w-\.]+@([\w-]+\.)+[\w-]{2,4})?$/;
var result=string.replace(/\s/g,“”).split(/,|;/);
for(变量i=0;i

接受逗号和分号作为分隔符,如果您只希望逗号作为分隔符,则更改为建议编辑:“。。。您应该在客户端检查地址是否包含**一个且只有一个**@…(但是,我认为本地部分不允许使用“@”)@克里斯汀:“@”可以用引号括起来,但只有在那里;我从未见过使用引号括起来的字符串,尽管它们可能提供了一种混淆垃圾邮件机器人的简单方法;人们还应该记住,下面的字符即使不加引号也是有效的:!#$%&'*+-/=?^{124;~btw,我想我曾经读到,甚至有人在“@”之后使用原始ccTLD域的邮件地址;不过,我不记得是哪个国家了。。。
     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;
    }