jQuery验证:如何为正则表达式验证添加规则?

我正在使用jQuery验证插件。伟大的东西!我想迁移我现有的ASP。NET解决方案使用jQuery代替ASP。净验证器。我缺少一个替换正则表达式验证器。我希望能够做到这样:

$("Textbox").rules("add", { regularExpression: "^[a-zA-Z'.\s]{1,40}$" })

我如何添加自定义规则来实现这一点?

398337 次浏览

你可以使用addMethod()

$.validator.addMethod('postalCode', function (value) {
return /^((\d{5}-\d{4})|(\d{5})|([A-Z]\d[A-Z]\s\d[A-Z]\d))$/.test(value);
}, 'Please enter a valid US or Canadian postal code.');

好文章在这里https://web.archive.org/web/20130609222116/http://www.randallmorey.com/blog/2008/mar/16/extending-jquery-form-validation-plugin/

感谢redsquare的回答,我添加了一个这样的方法:

$.validator.addMethod(
"regex",
function(value, element, regexp) {
var re = new RegExp(regexp);
return this.optional(element) || re.test(value);
},
"Please check your input."
);

现在你需要做的就是验证任何正则表达式:

$("#Textbox").rules("add", { regex: "^[a-zA-Z'.\\s]{1,40}$" })

此外,它看起来像有一个名为additional-methods.js的文件,其中包含方法“pattern”,当使用不带引号的方法创建时,它可以是一个RegExp


编辑

pattern函数现在是这样做的首选方法,使示例:

$("#Textbox").rules("add", { pattern: "^[a-zA-Z'.\\s]{1,40}$" })

稍微扩展一下PeterTheNiceGuy的回答:

$.validator.addMethod(
"regex",
function(value, element, regexp) {
if (regexp.constructor != RegExp)
regexp = new RegExp(regexp);
else if (regexp.global)
regexp.lastIndex = 0;
return this.optional(element) || regexp.test(value);
},
"Please check your input."
);

这将允许您向规则传递一个regex对象。

$("Textbox").rules("add", { regex: /^[a-zA-Z'.\s]{1,40}$/ });

当在RegExp对象上设置了__abc1 -标志时,重置lastIndex属性是必要的。否则,它将从与该正则表达式的最后一个匹配的位置开始验证,即使主题字符串不同。

我的其他一些想法是允许你使用正则表达式的数组,还有另一个正则表达式的否定规则:

$("password").rules("add", {
regex: [
/^[a-zA-Z'.\s]{8,40}$/,
/^.*[a-z].*$/,
/^.*[A-Z].*$/,
/^.*[0-9].*$/
],
'!regex': /password|123/
});

但实施这些可能会太过了。

正如在调用addMethod文档中提到的:

请注意:虽然添加一个regex方法来检查它的参数和值的诱惑很大,但将这些正则表达式封装在它们自己的方法中要干净得多。如果您需要许多略有不同的表达式,请尝试提取一个公共参数。正则表达式库:http://regexlib.com/DisplayPatterns.aspx

是的,你必须为每个正则表达式添加一个方法。开销是最小的,同时它允许您给正则表达式一个名称(不要低估),一个默认消息(方便)和在不同的地方重用它的能力,而不需要一遍又一遍地复制正则表达式本身。

我有一些麻烦把所有的部分做一个jQuery正则表达式验证器,但我得到了它的工作…下面是一个完整的工作示例。它使用“Validation”插件,该插件可以在jQuery验证插件 .中找到

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<script src="http://YOURJQUERYPATH/js/jquery.js" type="text/javascript"></script>
<script src="http://YOURJQUERYPATH/js/jquery.validate.js" type="text/javascript"></script>
<script type="text/javascript">


$().ready(function() {
$.validator.addMethod("EMAIL", function(value, element) {
return this.optional(element) || /^[a-zA-Z0-9._-]+@[a-zA-Z0-9-]+\.[a-zA-Z.]{2,5}$/i.test(value);
}, "Email Address is invalid: Please enter a valid email address.");


$.validator.addMethod("PASSWORD",function(value,element){
return this.optional(element) || /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,16}$/i.test(value);
},"Passwords are 8-16 characters with uppercase letters, lowercase letters and at least one number.");


$.validator.addMethod("SUBMIT",function(value,element){
return this.optional(element) || /[^ ]/i.test(value);
},"You did not click the submit button.");


// Validate signup form on keyup and submit
$("#LOGIN").validate({
rules: {
EMAIL: "required EMAIL",
PASSWORD: "required PASSWORD",
SUBMIT: "required SUBMIT",
},
});
});
</script>
</head>
<body>
<div id="LOGIN_FORM" class="form">
<form id="LOGIN" name="LOGIN" method="post" action="/index/secure/authentication?action=login">
<h1>Log In</h1>
<div id="LOGIN_EMAIL">
<label for="EMAIL">Email Address</label>
<input id="EMAIL" name="EMAIL" type="text" value="" tabindex="1" />
</div>
<div id="LOGIN_PASSWORD">
<label for="PASSWORD">Password</label>
<input id="PASSWORD" name="PASSWORD" type="password" value="" tabindex="2" />
</div>
<div id="LOGIN_SUBMIT">
<input id="SUBMIT" name="SUBMIT" type="submit" value="Submit" tabindex="3" />
</div>
</form>
</div>
</body>
</html>

没有理由将正则表达式定义为字符串。

$.validator.addMethod(
"regex",
function(value, element, regexp) {
var check = false;
return this.optional(element) || regexp.test(value);
},
"Please check your input."
);

而且

telephone: { required: true, regex : /^[\d\s]+$/, minlength: 5 },

这样更好,不是吗?

我让它像这样工作:

$.validator.addMethod(
"regex",
function(value, element, regexp) {
return this.optional(element) || regexp.test(value);
},
"Please check your input."
);




$(function () {
$('#uiEmailAdress').focus();
$('#NewsletterForm').validate({
rules: {
uiEmailAdress:{
required: true,
email: true,
minlength: 5
},
uiConfirmEmailAdress:{
required: true,
email: true,
equalTo: '#uiEmailAdress'
},
DDLanguage:{
required: true
},
Testveld:{
required: true,
regex: /^[0-9]{3}$/
}
},
messages: {
uiEmailAdress:{
required: 'Verplicht veld',
email: 'Ongeldig emailadres',
minlength: 'Minimum 5 charaters vereist'
},
uiConfirmEmailAdress:{
required: 'Verplicht veld',
email: 'Ongeldig emailadres',
equalTo: 'Veld is niet gelijk aan E-mailadres'
},
DDLanguage:{
required: 'Verplicht veld'
},
Testveld:{
required: 'Verplicht veld',
regex: '_REGEX'
}
}
});
});

确保正则表达式在/:-)之间

我们主要使用jquery验证插件的标记符号,张贴的样本并不适用于我们,当标志出现在正则表达式中,例如。

<input type="text" name="myfield" regex="/^[0-9]{3}$/i" />

因此,我们使用下面的代码片段

$.validator.addMethod(
"regex",
function(value, element, regstring) {
// fast exit on empty optional
if (this.optional(element)) {
return true;
}


var regParts = regstring.match(/^\/(.*?)\/([gim]*)$/);
if (regParts) {
// the parsed pattern had delimiters and modifiers. handle them.
var regexp = new RegExp(regParts[1], regParts[2]);
} else {
// we got pattern string without delimiters
var regexp = new RegExp(regstring);
}


return regexp.test(value);
},
"Please check your input."
);

当然,现在可以将这段代码与上面的代码结合起来,以允许将RegExp对象传递到插件中,但因为我们不需要它,所以我们把这个练习留给读者;-)。

PS:也有捆绑插件https://github.com/jzaefferer/jquery-validation/blob/master/src/additional/pattern.js

这是工作代码。

function validateSignup()
{
$.validator.addMethod(
"regex",
function(value, element, regexp)
{
if (regexp.constructor != RegExp)
regexp = new RegExp(regexp);
else if (regexp.global)
regexp.lastIndex = 0;
return this.optional(element) || regexp.test(value);
},
"Please check your input."
);


$('#signupForm').validate(
{


onkeyup : false,
errorClass: "req_mess",
ignore: ":hidden",
validClass: "signup_valid_class",
errorClass: "signup_error_class",


rules:
{


email:
{
required: true,
email: true,
regex: /^[A-Za-z0-9_]+\@[A-Za-z0-9_]+\.[A-Za-z0-9_]+/,
},


userId:
{
required: true,
minlength: 6,
maxlength: 15,
regex: /^[A-Za-z0-9_]{6,15}$/,
},


phoneNum:
{
required: true,
regex: /^[+-]{1}[0-9]{1,3}\-[0-9]{10}$/,
},


},
messages:
{
email:
{
required: 'You must enter a email',
regex: 'Please enter a valid email without spacial chars, ie, Example@gmail.com'
},


userId:
{
required: 'Alphanumeric, _, min:6, max:15',
regex: "Please enter any alphaNumeric char of length between 6-15, ie, sbp_arun_2016"
},


phoneNum:
{
required: "Please enter your phone number",
regex: "e.g. +91-1234567890"
},


},


submitHandler: function (form)
{
return true;
}
});
}

这对我来说是有效的,作为验证规则之一:

    Zip: {
required: true,
regex: /^\d{5}(?:[-\s]\d{4})?$/
}

希望能有所帮助

你可以使用additional-methods.js文件中定义的pattern。注意,这个附加方法.js文件必须包含 jQuery验证依赖,然后你可以使用

$("#frm").validate({
rules: {
Textbox: {
pattern: /^[a-zA-Z'.\s]{1,40}$/
},
},
messages: {
Textbox: {
pattern: 'The Textbox string format is invalid'
}
}
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.17.0/jquery.validate.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.17.0/additional-methods.min.js"></script>
<form id="frm" method="get" action="">
<fieldset>
<p>
<label for="fullname">Textbox</label>
<input id="Textbox" name="Textbox" type="text">
</p>
</fieldset>
</form>

    $.validator.methods.checkEmail = function( value, element ) {
return this.optional( element ) || /[a-z]+@[a-z]+\.[a-z]+/.test( value );
}


$("#myForm").validate({
rules: {
email: {
required: true,
checkEmail: true
}
},
messages: {
email: "incorrect email"
}
});

你试过这个吗?

$("Textbox").rules("add", { regex: "^[a-zA-Z'.\\s]{1,40}$", messages: { regex: "The text is invalid..." } })

注意:请务必转义所有的"\"加入另一个"\"在他们面前,否则正则表达式不会像预期的那样工作。