我正在使用js / jquery来检查字符串的有效格式,该字符串可以包含一到五个以逗号分隔的电子邮件地址。在使用以下方法时,我只有一个传递不应该通过的案例:
function isValidEmails(concatenatedEmails)
{
var compressedEmails = concatenatedEmails.replace(/ /g,'');
var emails = compressedEmails.split(',');
var isValid = true;
if(emails.length > 0 && emails.length <= 5)
{
$.each(emails, function(index, email)
{
if(!isValidEmailFormat(email))
{
isValid = false;
}
});
}
else
{
isValid = false;
}
return isValid;
}
function isValidEmailFormat(email)
{
return email.match("^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@"
+ "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$");
}
这些方法会捕获除传递的字符串之外的所有内容,例如:
"e1@mail.com, e2@mail.com, e3@mail.com, asdf"
这会捕获其他所有内容,但不知何故,此字符串将通过验证。有人可以说明如何提高效率吗?谢谢你的帮助。
答案 0 :(得分:1)
您的代码实际上对我来说运行正常。 。 。当“asdf”值在那里时返回false
,当我从列表中删除该值时返回true
。您是否尝试将值记录到控制台以查看可能会破坏的位置?
至于代码效率,在大多数情况下,您的代码看起来很好。我只能看到一些你可以做的事情来修剪它:
在each()
中检查电子邮件有效性的部分中,如果您return
该值,则当它为false时,它将停止处理其余电子邮件(毕竟,继续检查它们是没有意义的,一个是坏的)。这是一个很小的变化:
if(!isValidEmailFormat(email)) {
return (isValid = false);
}
这将在第一次触及无效email
值时停止循环,然后转到整个函数的return
。
您还可以通过使用和实际的RegExp
值而不是字符串)并添加i
标志来使正则表达式稍微复杂一点,以使模式不区分大小写。
function isValidEmailFormat(email) {
return email.match(/^[a-z0-9+_-]+(\.[a-z0-9_-]+)*@[a-z0-9-]+(\.[a-z0-9]+)*(\.[a-z]{2,})$/i);
}
这使您可以删除A-Z
的所有实例,并且无需使用双斜杠(\\
)。此外,+
不需要在字符组中进行转义,因此我删除了它。
除了这两件事,你的代码看起来还不错。