JS 正则——密码强度验证

646 阅读2分钟

需求:

  • 密码包含 数字-字母-符号(!@#);
      1. 包含一种~弱;
      1. 包含两种~中;
      1. 包含三种~强

密码强度.png

逻辑:

  • 判断密码符合这三种符号的哪些
    • 1.拿到密码
    • 2.准备正则符合三个强度的哪些?
    • 3.根据密码的强度,决定高亮几个span标签

代码

html

    <form>
        <label>
            密码 : <input type="text">
            <p>
                <span></span>
                <span></span>
                <span></span>
            </p>
        </label>
    </form>

css

        * {
            margin: 0;
            padding: 0;
        }

        form {
            width: 500px;
            padding: 20px;
            border: 5px solid pink;
            border-radius: 15px;
            margin: 50px auto;
        }

        label {
            font-size: 20px;
        }

        label>input {
            font-size: 20px;
            padding-left: 20px;
        }

        label>p {
            height: 30px;
            display: flex;
            justify-content: space-between;
            margin-top: 20px;
        }

        label>p>span {
            width: 30%;
            height: 100%;
            display: flex;
            justify-content: center;
            align-items: center;
            background-color: #ccc;
            color: #fff;
        }

        label>p>span:nth-child(1).active {
            background-color: red;
        }

        label>p>span:nth-child(2).active {
            background-color: orange;
        }

        label>p>span:nth-child(3).active {
            background-color: green;
        }

js

        // 0.获取标签
        const inp = document.querySelector('input')
        const spans = [...document.querySelectorAll('span')]

        // 1.给input绑定事件
        inp.oninput = function () {
            // 1.1拿到密码
            const value = this.value
            // 1.2准备正则
            const r1 = /\d/
            const r2 = /[a-zA-Z]/
            const r3 = /[!@#]/
            //1.3通过正则判断当前密码属于哪个强度等级
            let level = 0 //默认为0级
            if (r1.test(value)) {
                // 当前分支执行,说明当前密码包含数字
                level++
            }
            if (r2.test(value)) {
                // 当前分支执行,说明当前密码包含字母
                level++
            }
            if (r3.test(value)) {
                // 当前分支执行,说明当前密码包含特殊符号
                level++
            }

            /**
             * 1.4根据密码强度决定高亮哪些span标签
             * 
             *    思路:
             *        1.给所有span取消类名
             *        2.给我们需要的span添加类名
            */
            for (let i = 0; i < spans.length; i++) {
                // 1.给所有span取消类名
                spans[i].className = ''

                /**
                 * 2.给我们需要的span添加类名
                 *    level存储的是密码的强度等级
                 *      level === 1   高亮的是spans[0]
                 *      level === 2   高亮的是spans[0]spans[1]
                 *      level === 3   高亮的是spans[0]spans[1]spans[2]
                */
                if (i < level) {
                    spans[i].className = 'active'
                }

                /**
                 * 假设当前level === 2
                 * 
                 *    第一轮for循环 i === 0
                 *         内部判断条件 i < level  满足条件,执行spans[i].className = 'active'
                 * 
                 *    第二轮for循环 i === 1
                 *         内部判断条件 i < level  满足条件,执行spans[i].className = 'active'
                 * 
                 *    第三轮for循环 i === 2
                 *         内部判断条件 i < level  不满足条件,不执行
                */
            }
        }