带有preg_match的密码检查功能


password checking function with preg_match

我有这个功能:

public static function encPasswordCheckFailed($password)
    {
        if (!preg_match('/[A-Z]+/', $password)){
            return true;
        }
        if (!preg_match('/[a-z]+/', $password)){
            return true;
        }
        if (!preg_match('/[0-9]+/', $password)){
            return true;
        }
        if (!preg_match('/[!@#$%^&*()-+<>]+/', $password)) {
            return true;
        }
        return false;
    }

,现在我想强制用户至少有1个大写字母,1个小写字母,1个数字和1个特殊字符。

我遇到了这个问题:

if (!preg_match('/[!@#$%^&*()-+<>]+/', $password)) {
    return true;
}

所有其他要求工作。我只是对特殊字符有问题。
谁能告诉我这些特殊字符的正确模式:!@#$%^&*()-+<>

我已经从这里,这里和这里阅读了一些答案,但他们没有帮助我进一步…

您可能需要转义正则表达式引擎使用的一些特殊字符。顺便说一下,你也可以一次完成,如下图所示。快速测试。

<?php

    /*public static*/ function encPasswordCheckFailed($password) {
        // THIS READS:
        // IF THE PASSWORD DOES CONTAIN AN UPPER-CASE CHARACTER
        // AND ALSO DOES CONTAIN A LOWER-CASE CHARACTER
        // AND STILL DOES CONTAIN A NUMERIC CHARACTER
        // AND EVEN MORE, DOES CONTAIN ANY  OF THE SPECIFIED SPECIAL CHARACTERS 
        // RETURN FALSE OTHERWISE RETURN TRUE
        if (preg_match('/[A-Z]+/', $password) &&                    // CHECK FOR UPPERCASE CHARACTER
            preg_match('/[a-z]+/', $password) &&                    // AND CHECK FOR LOWERCASE CHARACTER
            preg_match('/[0-9]+/', $password)&&                     // AND CHECK FOR NUMERIC CHARACTER
            preg_match('/['!@#$%'^&'*'(')'-'+<>]+/', $password)     // AND CHECK FOR SPECIAL CHARACTER
        ) {
            return false;
        }
        return true;
    }
    var_dump( encPasswordCheckFailed("abcd123") );    //<== boolean true
    var_dump( encPasswordCheckFailed("abcD123") );    //<== boolean true
    var_dump( encPasswordCheckFailed("abcD1@23-") );  //<== boolean false

破折号/减号字符是您的问题,因为在字符组中,它表示字符范围。

你需要:

  • 用反斜杠转义,这样它就不会被视为特殊字符:
    /[!@#$%^&*()'-+<>]+/
  • 或者把它放在模式的末尾,这样PCRE引擎就知道它不可能表示范围:
    /[!@#$%^&*()+<>-]+/

类似地,插入符号(^)也是一个特殊字符,在字符组内表示否定,但是因为您没有将它放在字符组内的第一个位置,所以PCRE引擎知道它在您的情况下没有特殊意义。

特殊字符

preg_match('/'[!@#$%^&*'(')'-+<>']+/', $password);

如果它不工作,向下看:

其他答案:

  1. preg_match php特殊字符(pmm的答案)