0

我目前正在做一个 Javascript 密码控制,我必须针对密码与密码要求的每一次不匹配发出警报,这会告诉您输入的确切问题。

我一直在尝试和尝试,但从未找到解决方案。

所以这里是代码:

function checkForm(form)
  {

     var re = /^\w{6,10}$/;

    if(!re.test(form.pwd1.value)) {
      alert("Password in-between 6-10 characters");
      form.inputfield.focus();
      return false;
    }

    var re = /^[\w ]+$/;

    if(!re.test(form.pwd1.value)) {
      alert("You need to write something");
      form.inputfield.focus();
      return false;
    }

    var re = /^(?=.*[A-Z])\w{2,}$/;

    if(!re.test(form.pwd1.value)) {
      alert("At least two Upper case");
      form.inputfield.focus();
      return false;
    }


    var re = /^(?=.*[a-z])\w{2,}$/;

    if(!re.test(form.pwd1.value)) {
      alert(" At least two Lower Case letters");
      form.inputfield.focus();
      return false;
    }

    var re = /^(?=.*\d)\w{2,}$/;

    if(!re.test(form.pwd1.value)) {
      alert("At least two numbers");
      form.inputfield.focus();
      return false;
    }

    // validation was successful
    else(alert("Welcome!"));
    return true;
  }

我的问题是控制器以每个字符的一个字符而不是两个字符来解决,但是它需要您输入其中一个值中的至少两个,例如。2x 大写、2x 小写或 2x 数字。当它需要 6 个字符时,这是不可能不做的。最奇怪的是,这种表达方式确实有效!

如果有人对此有任何意见,我将不胜感激。谢谢!

4

3 回答 3

0

首先,每次都收到警报框很烦人,但如果这是您想要的,请更改您的上、下和数字检查模式;

^.*[A-Z]{2,}.*$
^.*[0-9]{2,}.*$
^.*[a-z]{2,}.*$
于 2013-05-17T23:06:17.500 回答
0

您的 2-Upper-case、2-Lower-case 和 2-Number 模式是错误的。你应该使用类似的东西:

var re = /^.*([A-Z].*){2,}$/;
var re = /^.*([a-z].*){2,}$/;
var re = /^.*([0-9].*){2,}$/;

请参阅这个简短的演示

编辑
请注意:

  • 通过使用\w,您可以将有效密码字符限制为字母、数字和下划线(此处有更多信息)。
  • 根据您提供的规格,您需要 2 个上位或 2 个下位或 2 位数字。这意味着如果用户未通过其中一项检查,您将无法提醒用户,因为他可能会成功进行下一次检查。您必须进行所有三项检查并在所有三项都失败时向用户发出警报。
  • 如果用户输入一个包含非\w字符(例如“abCD56-”)的 6-10 个字母的密码,他将被提示“密码应该在 6 到 10 个字符之间”,而他的密码6-10 个字符(只是不是您想要的字符),因此在这种情况下,该消息会产生误导。

我希望这会有所帮助。

于 2013-05-17T23:08:52.767 回答
0

您在代码中使用的模式与您可能想要的不同:

    var re = /^(?=.*\d)\w{2,}$/;

前瞻(?=.*\d)不消耗字符串中的任何字符。它向前看锚点以匹配模式.*\d如果字符串中有一个数字(即,任意数量的字符后跟一个数字),前瞻将返回成功匹配。

从概念上讲,一旦前瞻返回 true,解析器将尝试匹配\w{2,}$,它匹配任意数量的单词字符(字母、数字和_),然后是字符串的结尾。

结果是该模式将匹配由 2 个或多个单词字符组成的任何字符串,这些字符至少包含一个数字,而不是预期的两个数字。

作为更正,您有几个选择。由于您的第一个模式确保密码长度合适,因此您可以将此表达式替换为:

var re = /\d.*\d/;

这将找到一个数字后跟任何字符序列,然后是另一个数字(注意删除^$锚点,因为第一个数字可以出现在字符串中的任何位置)。

相同的概念可以应用于需要两个符号的其他模式:

var re = /^(?=.*[A-Z])\w{2,}$/; becomes var re = /[A-Z].*[A-Z]/;
var re = /^(?=.*[a-z])\w{2,}$/; becomes var re = /[a-z].*[a-z]/;
于 2013-05-17T23:21:32.160 回答