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

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

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


当前回答

感谢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。


Edit

pattern函数现在是执行此操作的首选方法,示例如下:

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

https://cdnjs.com/libraries/jquery-validate https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.19.2/jquery.validate.min.js https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.19.2/additional-methods.min.js

其他回答

正如addMethod文档中提到的:

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

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

你可以使用extra -methods.js文件中定义的模式。注意这个additional-methods.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>

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

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

希望能有所帮助

稍微扩展一下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对象上设置g标志时,必须重置lastIndex属性。否则,它将从与该正则表达式的最后一个匹配的位置开始验证,即使主题字符串不同。

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

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

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

我们主要使用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