繁体   English   中英

Javascript Regex密码验证问题

[英]Javascript Regex Password validation issues

我目前正在执行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个字符时,这是不可能做到的。 这是最奇怪的事情,这种表达实际上有效!

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

首先,每次都会出现令人讨厌的警报框,但如果您要更改它,则更改您的上下部和数字检查模式;

^.*[A-Z]{2,}.*$
^.*[0-9]{2,}.*$
^.*[a-z]{2,}.*$

您的2个大写字母,2个小写字母和2个数字格式是错误的。 您应该使用类似:

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

请看这个简短的演示

编辑
请注意:

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

希望对您有所帮助。

您的代码中使用了一种模式,该模式与您可能的意图有所不同:

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

前瞻(?=.*\\d)不会占用字符串中的任何字符。 它在锚点处向前看,以匹配模式.*\\d 如果字符串中包含一位数字(即,任意数量的字符后跟一位数字),则lookahead将返回成功的匹配项。

从概念上讲,一旦前瞻返回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]/;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM