51放假咯,不知道还有人混csdn么

解决方案 »

  1.   

    昏 非得用这种变形的方法 尽管思路不错 但确实是取巧的写法 建议还是用下面的方式保险点
    if(/\d/.test(word))i++;
    if(/\W/.test(word))i++;
    if(/[a-z]/.test(word))i++;
    if(/[A-Z]/.test(word))i++;
      

  2.   

    谢谢gzdiablo
    稍后结贴给你分,我想看看其他人有没有什么解释
      

  3.   

    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    ※以下是引用7楼 mingxuan3000(铭轩) 在2007-5-4 0:12:37 的发言:
    ──────────────────────────────────────────
    查了好几个小时,现在我还没搞懂为什么在ie下回显示每类最后一个
    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    确实是这样的,你可以在.net等其它正则引擎下测试.都能得出这样的结果,FF却不是
      

  4.   

    To楼主我是这段程序的作者
    http://www.cnblogs.com/0009/archive/2007/04/24/725568.html
    当时写这段脚本的时候也只是在论坛上帮别人写的.当时就没有考虑到FF的兼容.所以这段脚本只能是做为参考了.稍后我会写一段更通用的检测代码发到BLOG上去的
      

  5.   

    http://www.cnblogs.com/0009/archive/2007/04/24/725568.html
      

  6.   

    考虑到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>
      

  7.   

    上面发的少了个^,应该改为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;
        }
    }
      

  8.   

    呵呵,这么有幸啊,把作者招来了
    ps:我是从这里找到这个函数的
    http://blog.csdn.net/shoutor/archive/2007/04/25/1583775.aspx支持原创,谢谢 0009(夏天以南) 看来只能绕弯子解决这个问题了:(
      

  9.   

    http://www.cnblogs.com/0009/archive/2007/05/08/738888.html
      

  10.   

    哦另外我上面的也有点问题 稍微改下因为 \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;
    }
    }
      

  11.   

    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次的中断匹配(匹配到第一个就返回) 
      

  12.   

    楼上说的很有道理,虽然以下两个正则的基本思路是一样的.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好友了,以后还有机会讨论 :)