JavaScript我测试密码的功能不起作用

时间:2012-06-19 13:59:05

标签: javascript regex

function demoMatchClick() {
  var validString = /^[a-z](?=[a-z]*[0-9])[a-z0-9]{0,6}[a-z]$/
  var re = new RegExp(validString);
  if (document.form1.subject.value.test(re)) {
    alert("Successful match");
  } else {
    alert("No match");
  }
}

<INPUT TYPE=SUBMIT VALUE="Replace" ONCLICK="demoReplaceClick()">

我无法弹出警告弹出

我希望强制执行这些规则

•Not have upper-case letters. 
•Begin with a letter. 
•Have at least 1 digit(s) not at the beginning and end. 
•Have up to 8 alphanumeric 
•Does NOT have any symbols like @#$ characters (symbols like !@#$%^&*()-+). 

我现在使用按钮执行代码。

2 个答案:

答案 0 :(得分:1)

以下是修改后的代码:

function demoMatchClick(input) {
  var validString = /^[a-z](?=[a-z]*[0-9])[a-z0-9]{0,6}[a-z]$/;
  if (validString.test(input)) {
    alert("Successful match");
  } else {
    alert("No match");
  }
}


demoMatchClick("hello world");

validString变量已经是一个RegExp对象,你可以直接使用它。另外.test()方法属于regex对象而不是字符串。

答案 1 :(得分:1)

好吧,我想这个正则表达式适合你的规则......

var rules = /^[a-z](?=[a-z]*[0-9])[a-z0-9]{0,6}[a-z]$/;

但我认为您的代码存在一些问题,我想指出。请不要将其视为个人冒犯,请:相信我,我实际上为你节省了大量的时间和精力。

首先,有一个标准规则:每个功能应该只做一件事 - 但做得非常好(或者他们说,这些完美主义者!)。你的代码与DOM提取过于紧密联系:当我粘贴在我的环境中时,我感到非常惊讶!只有这时我才注意到document.forms电话。这里不需要它:构建一个带一个参数的函数就足够了,然后用其他地方提取的值调用这个函数。通过这种方式,顺便说一句,您可以轻松地分离错误原因:它可以是DOM部分,也可以是函数内部。

其次,正则表达式非常接近被认为是JavaScript中的一等公民(不像Perl那样,但仍然比其他语言更接近)。这意味着你可以按原样编写正则表达式文字,并在以后使用它 - 没有新的Regexp结构。

说了这么多,我把你的代码写成......

function validatePassword(password) {
  var rules = /^[a-z](?=[a-z]*[0-9])[a-z0-9]{0,6}[a-z]$/;
  return rules.test(password);
}

...然后通过像......这样的东西来使用它。

var password = document.form1.subject.value;
alert( validatePassword(password) ? 'Success! :)' : 'Failure... :(' );

P.S。是的,Riccardo是对的:为密码制定了过于严格的规则 - 并且遭受了缩小搜索攻击范围的后果。并且很容易看到Javascript中设置的验证规则:即使是混淆器也无济于事。