日期:2014-05-16  浏览次数:20285 次

js验证密码强度代码的两个疑问
<script type="text/javascript" >
function EvaluatePassword(word) {
  if (word == "") {
  return 0;
}
else if (word.length < 6) {
  return 1;
}
else {


return word.match(/[a-z](?![^a-z]*[a-z])|[A-Z](?![^A-Z]*[A-Z])|\d(?![^\d]*\d)|[^a-zA-Z\d](?![a-zA-Z\d]*[^a-zA-Z\d])/g).length;
  }
}

function CheckPassword(password) {
document.getElementById("n").innerHTML = function (password) {
  switch (EvaluatePassword(password)) {
  case 0:
  return "未输入";
  case 1:
  return "太简单";
  case 2:
  return "还可以";
  case 3:
  return "比较强";
  case 4:
  return "非常强";
  }
 }(password) //这个匿名函数尾巴上为啥还有个参?

}
  </script>
  <input type="text" id="txt" onkeyup="CheckPassword(this.value)"><label id="n"></label>

这个代码是我找的,两个地方看不懂:

1、谁能解释下那个正则,我有点看不懂负向前瞻里面那块

2、上面也提出了,函数尾巴上为啥还有个参,我看到有些函数是这种写法,哪怕里面没有参数,右大括号后也要带个括号
没有就运行不起,请问是什么原因



------解决方案--------------------
1.http://topic.csdn.net/u/20110124/02/903e8edd-afc0-4a55-80d2-719317cd6684.html
2.自执行函数
------解决方案--------------------
这个还真不好解释呢,主要是他的实现有点绕。。
这么说吧,/[a-z](?![^a-z]*[a-z])|[A-Z](?![^A-Z]*[A-Z])|\d(?![^\d]*\d)|[^a-zA-Z\d](?![a-zA-Z\d]*[^a-zA-Z\d])/g总共由四部分组成,分别是
1) [a-z](?![^a-z]*[a-z])
2) [A-Z](?![^A-Z]*[A-Z])
3) \d(?![^\d]*\d)
4) [^a-zA-Z\d](?![a-zA-Z\d]*[^a-zA-Z\d]
正好对应密码的组成元素(小写字母,大写字母,数字,符号);本来呢实现查找小写字母,大写字母,数字,符号只需要/[a-z]+|[A-Z]+|\d+|[^a-zA-Z\d]+/g就可以了,但是密码是没有固定形式的,比如abc123cde这种形式就会出问题了,用/[a-z]+|[A-Z]+|\d+|[^a-zA-Z\d]+/g会得到abc,123,cde三个匹配,不符合要求,所以用[a-z](?![^a-z]*[a-z])过滤掉了abc,其他的同理。。
再说下[a-z](?![^a-z]*[a-z]),这个正则表示匹配一个小写字母,且这个小写字母后面不能紧跟着小括号中描述的组合(若干个非小写字母 + 一个小写字母),其他的同理。。

第二个问题是自执行函数的写法,var ret = function demo(arg){return arg;})(str)表示定义了demo函数并传入str参数并执行,
------解决方案--------------------
如果不加那个括号document.getElementById("n").innerHTML = function (password) {
...
 }这样写只是定义了一个匿名函数,并把这个匿名函数的引用传给n的innerHTML