0
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 个字母数字
•没有像@#$ 字符这样的符号(像!@#$%^&*()-+ 这样的符号)。

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

4

2 回答 2

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 对象而不是字符串。

于 2012-06-19T14:24:54.520 回答
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... :(' );

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

于 2012-06-19T14:30:29.833 回答