JavaScript 我测试密码的函数不起作用


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()">

我无法让它弹出警报

弹出

我希望执行这些规则

•没有大写字母。•以字母开头。•开头和结尾至少有 1 位数字。•最多有 8 个字母数字•没有任何符号,如 @#$ 字符(符号如 !@#$%^&*()-+)。

我现在正在使用一个按钮来执行代码。

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

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

但我认为您的代码有几个问题,我想指出这一点。请不要把它当作个人冒犯:相信我,我实际上为你节省了很多时间和神经。

首先,有一个标准规则:每个函数应该只做一件事 - 但做得非常好(或者他们说,这些完美主义者!)。您的代码与 DOM 提取耦合得太紧密了:当它粘贴到我的环境中时无法工作时,我真的很惊讶!直到那时我才注意到document.forms电话。这里并不需要它:构建一个接受一个参数的函数就足够了,然后使用其他地方提取的值调用这个函数。这样,顺便说一句,你可以很容易地分离错误的原因:它要么在 DOM 部分,要么在函数中。

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

综上所述,我会将您的代码编写为...

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... :(' );

附言是的,里卡多是对的:为密码设置过于严格的规则 - 并遭受缩小搜索攻击者范围的后果。而且很容易看到Javascript中设置的验证规则:即使是混淆器也无济于事。

以下是修改后的代码:

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 变量已经是一个正则表达式对象,你可以直接使用它,另外 .test() 方法属于正则表达式对象而不是字符串。

最新更新