>  기사  >  백엔드 개발  >  비밀번호 규칙 정규 일치, 또 다른 질문: 정규 표현식이 왜 비효율적입니까?

비밀번호 규칙 정규 일치, 또 다른 질문: 정규 표현식이 왜 비효율적입니까?

WBOY
WBOY원래의
2016-08-26 10:12:521286검색

규칙은 다음과 같습니다.
비밀번호 형식: 6~16자리 영숫자 조합
특수문자를 포함할 수 없습니다.
숫자, 대문자, 소문자 3개가 동시에 포함되어야 합니다. 대소문자를 구분합니다.
연속된 3자리 이상의 숫자가 연속될 수 없습니다(예: 123, 876)
연속된 3자리 이상의 문자가 연속될 수 없습니다(예: abc, cba, aaa, 111, AAA)

<code>echo !preg_match('/\d{3,}|[a-zA-Z]{3,}/', $password);
echo preg_match('/\d+/', $password);
echo preg_match('/[a-z]+/', $password);
echo preg_match('/[A-Z]+/', $password);
echo preg_match('/^([a-zA-Z0-9]){6,16}$/', $password);
</code>

위는 제가 생각해낸 요구사항과 솔루션입니다

하지만 저는 늘 좀 더 간결하게 매치하고 싶은데 누군가가 더 좋은 아이디어를 주셨으면 좋겠습니다.

또 다른 질문: 정규 표현식이 비효율적인 이유는 무엇입니까?

정규식을 사용하여 연속된 숫자와 문자를 판단하는 것은 너무 복잡하고 비효율적이므로 논리적인 코드 판단을 사용합니다. PHP에서 작성한 코드는 다음과 같습니다. php5.5.12에서 초기 테스트는 성공적이었습니다.

<code>/**
 * 密码格式:6-16位数字字母组合
 * 不包含特殊字符。
 * 必须同时包含数字、大写字母,小写字母3种字符,区分大小写。
 * 连续3位及以上数字不能连续(例如123、876)
 * 连续3位及以上的字母不能连续(例如abc、cba)
 * @param string $password
 * @return boolean 是否匹配
 */
function CheckPassword($password){
    if (strlen($password) > 16 || strlen($password) < 6) {
        return false;
    }

    // ASCII code vallue
    $upperLetter = range(65, 90);
    $lowerLetter = range(97, 122);
    $number = range(48, 57);

    $includeNumber = false;
    $includeUpperLetter = false;
    $includeLowerLetter = false;
    $continuousCharNum = 0;

    for ($i=0; !empty($password[$i]); $i++) {
        // 特殊字符
        if (!in_array(ord($password[$i]), array_merge($upperLetter, $lowerLetter, $number))) {
            return false;
        }
        // 大写字母
        if (!$includeUpperLetter && in_array(ord($password[$i]), $upperLetter)) {
            $includeUpperLetter = true;
        }
        // 数字
        if (!$includeNumber && in_array(ord($password[$i]), $number)) {
            $includeNumber = true;
        }
        // 小写字母
        if (!$includeLowerLetter && in_array(ord($password[$i]), $lowerLetter)) {
            $includeLowerLetter = true;
        }
        if ($i != 0 && !empty($password[$i+1])
            && abs(ord($password[$i]) - ord($password[$i-1])) <= 1 && ord($password[$i]) - ord($password[$i-1]) == ord($password[$i+1]) - ord($password[$i])) {
            return false;
        }
    }
    if ($includeLowerLetter && $includeNumber && $includeUpperLetter) {
        return true;
    } else {
        return false;
    }
}</code>
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.