jQuery验证正则表达式:多个规则检查,相同的字段

时间:2010-12-09 01:38:07

标签: jquery regex jquery-validate

我有一个jQuery验证正则表达式,用于检查是否包含短语:

$.validator.addMethod("regex", function(value, element, regexp) {
    return this.optional(element) || regexp.test(value);
}, "You must include the required keyword phrase(s).");

如果我要检查多个短语,我将其添加:

$("#text").rules("add", { regex: /phrase one/i });
$("#text").rules("add", { regex: /another phrase/i });
$("#text").rules("add", { regex: /test phrase/i });

我遇到的问题是它只检查最后一个短语规则,这意味着如果包含“测试短语”,但其他规则不包含,则会接受它。我需要检查以确保包含所有短语。

我还希望错误消息能够包含缺少的阶段,例如,如果缺少“另一个短语”,则错误将是:

  

您必须包含所需的词组:另一个词组

THX

2 个答案:

答案 0 :(得分:1)

您应该创建一个特定于需求的方法,而不是使用通用正则表达式:

var vInstance = $("form").validator(/* options */);

$.validator.addMethod("multiPhrases", function (value, element, phrases) {
   var missingPhrase, errObject = {};

   // Check for all the phrases
   for (var i = 0; i < phrases.length; i++) {
      if (value.toLowerCase().indexOf(phrases[i].toLowerCase()) < 0) {
         // Phrase not found
         missingPhrase = phrases[i];
         break;
      }
   }

   // Show the error yourself
   if (missingPhrase) {
      errObject[$(element).attr("name")] =
         "You must include the required phrase: " +
         missingPhrase;
      vInstance.showErrors(errObject);
   }

   // Tell the plugin if there was an error
   return (missingPhrase == false);
});

这要求您的输入具有name属性,并且您需要在创建时保存对验证器对象(vInstance)的引用。在查看jQuery验证器的API之后,这是我能想到的最好的黑客攻击。 IMO,一个不错的验证插件应该允许您从自定义函数返回自定义错误消息...

像这样使用它:

$("#text").rules("add", {multiPhrases: [
   "phrase one",
   "another phrase",
   "test phrase"
]});

答案 1 :(得分:0)

我使用了Box9的答案,并解决了他的问题,Ricky正在用“警告:未定义消息......”覆盖该消息。 因此,完整且有效的解决方案将是:

引用专栏9:

您应该创建一个特定于需求的方法,而不是使用通用正则表达式:

$("form").validator(/* options */);

$.validator.addMethod("multiPhrases", function (value, element, phrases) {
  var missingPhrase, errObject = {};

  // Check for all the phrases
  for (var i = 0; i < phrases.length; i++) {
    if (value.toLowerCase().indexOf(phrases[i].toLowerCase()) < 0) {
       // Phrase not found
       missingPhrase = phrases[i];
       break;
    }
  }

  // Set the message as default for this validation
  if (missingPhrase) {
    errObject["multiPhrases"] =
        "You must include the required phrase: " + missingPhrase;
     jQuery.extend(jQuery.validator.messages, errObject);
  }

  // Tell the plugin if there was an error
  return (missingPhrase == false);
});

而不是像Box9最初使用showErrors()那样自己显示错误,你必须将它设置为此验证的默认消息,因为jQuery.validation插件无论如何都会查找默认值,并覆盖之前显示的任何错误这个元素。

再次引用Box9:

这要求您的输入具有名称属性。

像这样使用它:

$("#text").rules("add", {multiPhrases: [
   "phrase one",
   "another phrase",
   "test phrase"
]});

感谢Box9Ricky最初发布此内容,因为它帮助我找到了解决方案。