使用preg_match进行密码检查功能

时间:2016-11-16 10:09:36

标签: php regex validation

我有这个功能:

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;
}

所有其他要求都有效。我对特殊字符只有一个问题。
有人可以告诉我这些特殊字符的正确模式:!@#$%^&*()-+<>

我已经阅读了hereherehere的部分答案,但这些答案对我没有帮助......

3 个答案:

答案 0 :(得分:2)

  

您可能需要转义正则表达式引擎使用的一些特殊字符。顺便说一句,你可以在一个Go中做到这一点,如下所示。 Quick-Test Here

<?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

答案 1 :(得分:1)

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

您需要:

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

同样,插入符号(^)也是一个特殊字符,表示在字符组内部时出现否定,但是因为你没有把它放在字符组内的第一个位置,所以PCRE引擎知道它没有特殊意义。

答案 2 :(得分:0)

这将适用于特殊角色:

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

如果它不起作用,请往下看:

其他答案:

  1. preg_match php special characterspmm的答案)