Javascript Regex:允许多封电子邮件以分隔;(分号)和允许空白/空值
这是我的正则表达式:Javascript Regex:允许多封电子邮件以分隔;(分号)和允许空白/空值,javascript,angularjs,regex,validation,Javascript,Angularjs,Regex,Validation,这是我的正则表达式: var emailsRegex = /^[\W]*([\w+\-.%]+@[\w\-.]+\.[A-Za-z]{2,4}[\W]*;{1}[\W]*)*([\w+\-.%]+@[\w\-.]+\.[A-Za-z]{2,4})[\W]*$/; 目前,它允许完全限定的单个电子邮件和用分号分隔的多个电子邮件,例如: email1@hi.com email1@hi.com; email2@hi.com email1@hi.com; email2@hi.com; email3@
var emailsRegex = /^[\W]*([\w+\-.%]+@[\w\-.]+\.[A-Za-z]{2,4}[\W]*;{1}[\W]*)*([\w+\-.%]+@[\w\-.]+\.[A-Za-z]{2,4})[\W]*$/;
目前,它允许完全限定的单个电子邮件和用分号分隔的多个电子邮件,例如:
email1@hi.com
email1@hi.com; email2@hi.com
email1@hi.com; email2@hi.com; email3@hi.com
…都是有效的
我希望它保持不变,但也允许空白/空输入。我的表单使用空白输入字段标记$invalid,即使未在输入字段上指定required
属性
我怀疑这是因为它没有通过正则表达式验证。谢谢 。首先,你的正则表达式是错误的(它不会匹配像foo这样的电子邮件)+bar@example.org
对于RFC822和更新的RFC,这是完全有效的)。你最好使用像或这样的库来检查电子邮件
然后,您所要做的就是使用email_string.split(“;”)
在每封电子邮件周围分割字符串,并对每封电子邮件应用检查程序
HTH我最终使用了string.split(;),然后通过了一个改进的正则表达式,它应该占到今天使用的电子邮件地址的99%。我是在一个角度指令内做的 它允许空输入,多封电子邮件用
分隔代码>符合大多数电子邮件地址使用的RFC
HTML
安格拉斯
angular.module('my-app')
.directive('multipleEmails', function () {
return {
require: 'ngModel',
link: function (scope, element, attrs, ctrl) {
ctrl.$parsers.unshift(function (rawInput) {
var emails = rawInput.split(';');
//console.log(emails);
// Consider not using complex regex validation for emails. See: https://davidcel.is/posts/stop-validating-email-addresses-with-regex/
// Instead, consider just checking for an "@" and a "." and call it a done. The mail daemon will return whether its a valid or invalid/bounced email address
//var emailsRegex = /.+@.+\..+/i;
// define single email validator here
var regexPattern = /^(([^<>()\[\]\\.,;:\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,}))$/;
// angular.foreach(emails, function() {
var validityArr = emails.map(function (str) {
if (rawInput) {
return regexPattern.test(str.trim());
} else if (!rawInput) {
return true;
}
}); // sample return is [true, true, true, false, false, false]
//console.log(emails, validityArr);
var atLeastOneInvalid = false;
angular.forEach(validityArr, function (value) {
if (value === false)
atLeastOneInvalid = true;
});
if (!atLeastOneInvalid) {
// ^ all I need is to call the angular email checker here, I think.
ctrl.$setValidity('multipleEmails', true);
return rawInput;
} else {
ctrl.$setValidity('multipleEmails', false);
return undefined;
}
});
}
};
});
angular.module('my-app'))
.directive('multipleEmails',函数(){
返回{
要求:'ngModel',
链接:函数(范围、元素、属性、ctrl){
ctrl.$parsers.unshift(函数(rawInput){
var=rawInput.split(“;”);
//控制台日志(电子邮件);
/考虑不要对电子邮件使用复杂的正则表达式验证。请参见:https://davidcel.is/posts/stop-validating-email-addresses-with-regex/
相反,考虑只检查一个“@”和“a”。然后调用它完成。邮件守护进程将返回它的有效或无效/跳转电子邮件地址。
//var emailsRegex=/.+@.+\..+/i;
//在此定义单个电子邮件验证程序
变量regexpatern=/^([^()\[\]\\,;:\s@“]+(\.[^()\[\]\\,;:\s@“]+)*(“+”)(\[[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}]);([a-zA Z-0-9]+-zA 2]);
//angular.foreach(电子邮件、函数(){
var validityar=emails.map(函数(str){
如果(输入){
返回regexptern.test(str.trim());
}如果(!rawInput){
返回true;
}
});//样本返回为[真,真,真,假,假,假]
//控制台日志(电子邮件、验证码);
var atLeastOneInvalid=false;
角度forEach(有效值、函数(值){
如果(值===false)
atLeastOneInvalid=true;
});
如果(!AtlastoneInvalid){
//^我想我只需要打电话给这里的电子邮件检查器。
ctrl.$setValidity('multipleEmails',true);
返回原始输入;
}否则{
ctrl.$setValidity('multipleEmails',false);
返回未定义;
}
});
}
};
});
试试这个/([^your regex,]\/*/gAs回答说,使用正则表达式来验证电子邮件充满了危险。你最多应该检查以确保@
存在。之后,验证地址的唯一真正方法是发送电子邮件。我喜欢检查@
和
-并且允许空-正则表达式用于什么?/.++.+\..+/i
有效,但它仍然不允许为空。谢谢你,我正在阅读你的文章建议,很快就会回来接受。这篇文章很有意义。但是我不想仅仅为了查看电子邮件而包含另一个库。我更喜欢他们的建议,只检查@
和
和call它是有效的。那么我如何使这个正则表达式允许为空或任何带有
和
的东西呢?他推荐的/.++.++.++.++.++/I
会进行检查,但不允许为空。哦,你可以试试/(.++.++.+.+.+.+)/I
这个()
会对整个模式进行分组,并且()?
将使其匹配正则表达式本身的0
或1
倍。
angular.module('my-app')
.directive('multipleEmails', function () {
return {
require: 'ngModel',
link: function (scope, element, attrs, ctrl) {
ctrl.$parsers.unshift(function (rawInput) {
var emails = rawInput.split(';');
//console.log(emails);
// Consider not using complex regex validation for emails. See: https://davidcel.is/posts/stop-validating-email-addresses-with-regex/
// Instead, consider just checking for an "@" and a "." and call it a done. The mail daemon will return whether its a valid or invalid/bounced email address
//var emailsRegex = /.+@.+\..+/i;
// define single email validator here
var regexPattern = /^(([^<>()\[\]\\.,;:\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,}))$/;
// angular.foreach(emails, function() {
var validityArr = emails.map(function (str) {
if (rawInput) {
return regexPattern.test(str.trim());
} else if (!rawInput) {
return true;
}
}); // sample return is [true, true, true, false, false, false]
//console.log(emails, validityArr);
var atLeastOneInvalid = false;
angular.forEach(validityArr, function (value) {
if (value === false)
atLeastOneInvalid = true;
});
if (!atLeastOneInvalid) {
// ^ all I need is to call the angular email checker here, I think.
ctrl.$setValidity('multipleEmails', true);
return rawInput;
} else {
ctrl.$setValidity('multipleEmails', false);
return undefined;
}
});
}
};
});