这个正则在ie与ff中的结果不一样 51放假咯,不知道还有人混csdn么 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 昏 非得用这种变形的方法 尽管思路不错 但确实是取巧的写法 建议还是用下面的方式保险点if(/\d/.test(word))i++;if(/\W/.test(word))i++;if(/[a-z]/.test(word))i++;if(/[A-Z]/.test(word))i++; 谢谢gzdiablo稍后结贴给你分,我想看看其他人有没有什么解释 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━※以下是引用7楼 mingxuan3000(铭轩) 在2007-5-4 0:12:37 的发言:──────────────────────────────────────────查了好几个小时,现在我还没搞懂为什么在ie下回显示每类最后一个━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━确实是这样的,你可以在.net等其它正则引擎下测试.都能得出这样的结果,FF却不是 To楼主我是这段程序的作者http://www.cnblogs.com/0009/archive/2007/04/24/725568.html当时写这段脚本的时候也只是在论坛上帮别人写的.当时就没有考虑到FF的兼容.所以这段脚本只能是做为参考了.稍后我会写一段更通用的检测代码发到BLOG上去的 http://www.cnblogs.com/0009/archive/2007/04/24/725568.html 考虑到FF的兼容只能这样做了,尝试了半天还是不能用一个正则解决是有点遗憾呵呵<script language="JavaScript">var test = new Array("", "a1_", "abcdef", "abcde123", "ads23%", "aA1B2^&2");for(var i in test){ document.write(test[i] + " → " + EvaluatePassword(test[i])); document.write("<br />");}function EvaluatePassword(word){ if (word == "") { return 0; } else if(word.length < 6) { return 1; } else { var regex = /[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; var matches = word.match(regex); return matches.length; }}</script> 上面发的少了个^,应该改为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; }} 呵呵,这么有幸啊,把作者招来了ps:我是从这里找到这个函数的http://blog.csdn.net/shoutor/archive/2007/04/25/1583775.aspx支持原创,谢谢 0009(夏天以南) 看来只能绕弯子解决这个问题了:( http://www.cnblogs.com/0009/archive/2007/05/08/738888.html 哦另外我上面的也有点问题 稍微改下因为 \W不包括_function checkpassword(value){if(typeof(value)=="string"){var i=0;if(value.length<6 && value.length>20)return i;if(/\d/.test(value))i++;//判断是否包含数字if(/[\W_]/.test(value))i++;//判断是否包含特殊符号if(/[a-z]/.test(value))i++;//判断是否包含小写if(/[A-Z]/.test(value))i++;//判断是否包含大写return i;}} lz的方法效率的确很高 变化的也很巧妙 我同意我只是对0009(夏天以南) 的方法不赞同因为(?!)是全文的回溯查询 其资源消耗等同于2次匹配查询与其这样到不如直接多次匹配多次匹配的效率比回溯查询还高 因为没有使用/g所以只是匹配到第一个就终止匹配了但下面的表达式 /[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表达式的意思很简单 匹配最后一个[a-z] [A-Z] \d [^a-zA-Z\d]但它不但用了4次回溯 实际匹配过程中的回溯次数可能更多 因为必须1条表达式完成查询必不可少的使用/g多次匹配 更加增加了匹配和回溯的次数 所以说这圈子兜得太大了 与其这样到不如使用最简单的方法 而且只是4个判断语句和累加 还有4次的中断匹配(匹配到第一个就返回) 楼上说的很有道理,虽然以下两个正则的基本思路是一样的.word.replace(/^(?:([a-z])|([A-Z])|([0-9])|(.)){6,}|(.)+$/g, "$1$2$3$4$5").length;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;但是第二个的效率确实不能跟第一个相比.对于效率的分析我赞同你的意见.不过对于这个实际问题--密码的评估,这种效率的影响是微乎其微的.----题外话: 实际上我的日常工作是不涉及到WEB的,所以做这些都只是出于爱好和钻研性质的,更多时候我考虑的是技巧性,而有点忽略了实用性,写第一个正则的时候就是这样,当时都没想过去兼容FF.我加你为CSDN好友了,以后还有机会讨论 :) 【求助】jqGrid Demoes 配置步骤。 及时保留小数位数,控制光标位置(急)? 不断加1,至99999999,长度保持8位长度. JS操作HTML节点添加子节点? javascript验证的问题!! 单选框的联动 新手,一分都没有,但是程序代码问题要解决,请高手开恩 《WebApp实时开源开发框架Clouda深入评测》有奖博文征集活动 一个iframe滚动条的问题。 如何限制文本框输入字符的长度? 在文本框中输入日期在另一文本框中得到星期几(速度)﹗ 关于function的问题
if(/\d/.test(word))i++;
if(/\W/.test(word))i++;
if(/[a-z]/.test(word))i++;
if(/[A-Z]/.test(word))i++;
稍后结贴给你分,我想看看其他人有没有什么解释
※以下是引用7楼 mingxuan3000(铭轩) 在2007-5-4 0:12:37 的发言:
──────────────────────────────────────────
查了好几个小时,现在我还没搞懂为什么在ie下回显示每类最后一个
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
确实是这样的,你可以在.net等其它正则引擎下测试.都能得出这样的结果,FF却不是
http://www.cnblogs.com/0009/archive/2007/04/24/725568.html
当时写这段脚本的时候也只是在论坛上帮别人写的.当时就没有考虑到FF的兼容.所以这段脚本只能是做为参考了.稍后我会写一段更通用的检测代码发到BLOG上去的
var test = new Array("", "a1_", "abcdef", "abcde123", "ads23%", "aA1B2^&2");
for(var i in test)
{
document.write(test[i] + " → " + EvaluatePassword(test[i]));
document.write("<br />");
}
function EvaluatePassword(word)
{
if (word == "")
{
return 0;
}
else if(word.length < 6)
{
return 1;
}
else
{
var regex = /[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;
var matches = word.match(regex);
return matches.length;
}
}
</script>
{
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;
}
}
ps:我是从这里找到这个函数的
http://blog.csdn.net/shoutor/archive/2007/04/25/1583775.aspx支持原创,谢谢 0009(夏天以南) 看来只能绕弯子解决这个问题了:(
{
if(typeof(value)=="string")
{
var i=0;
if(value.length<6 && value.length>20)return i;
if(/\d/.test(value))i++;//判断是否包含数字
if(/[\W_]/.test(value))i++;//判断是否包含特殊符号
if(/[a-z]/.test(value))i++;//判断是否包含小写
if(/[A-Z]/.test(value))i++;//判断是否包含大写
return i;
}
}
我只是对0009(夏天以南) 的方法不赞同因为(?!)是全文的回溯查询 其资源消耗等同于2次匹配查询与其这样到不如直接多次匹配
多次匹配的效率比回溯查询还高 因为没有使用/g所以只是匹配到第一个就终止匹配了但下面的表达式
/[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
表达式的意思很简单 匹配最后一个[a-z] [A-Z] \d [^a-zA-Z\d]但它不但用了4次回溯 实际匹配过程中的回溯次数可能更多 因为必须1条表达式完成查询必不可少的使用/g多次匹配 更加增加了匹配和回溯的次数 所以说这圈子兜得太大了 与其这样到不如使用最简单的方法 而且只是4个判断语句和累加 还有4次的中断匹配(匹配到第一个就返回)
不过对于这个实际问题--密码的评估,这种效率的影响是微乎其微的.
----
题外话: 实际上我的日常工作是不涉及到WEB的,所以做这些都只是出于爱好和钻研性质的,更多时候我考虑的是技巧性,而有点忽略了实用性,写第一个正则的时候就是这样,当时都没想过去兼容FF.我加你为CSDN好友了,以后还有机会讨论 :)