繁体   English   中英

使用PHP preg_match验证密码策略

[英]Validate password policy with PHP preg_match

我正在尝试使用preg_match和RegEx验证密码,但是它似乎不起作用。 我想做的是:确保密码满足以下最低要求:-包含大小写混合的字母-包含至少一个数字-只要满足以上两个条件,其余即可为任何数字。

我已经尝试了以下RegEx,但它似乎无法正常工作:

(?=.*?[a-z])(?=.*?[A-Z])(?=.*?[0-9])

我以前有其他更简单的RegEx,例如: [A-Za-z0-9]但没有成功。 我正在检查preg_match($string, $pattern) == 0 (表示模式不匹配=>验证失败),但它始终返回0。我在做什么错?

只需将一个起始锚添加到您的正则表达式中,

^(?=.*?[a-z])(?=.*?[A-Z])(?=.*?[0-9])

要么

^(?=.*?[a-z])(?=.*?[A-Z])(?=.*?[0-9]).*

例:

$yourstring = 'Ab';
$regex = '~^(?=.*?[a-z])(?=.*?[A-Z])(?=.*?[0-9])~m';
if (preg_match($regex, $yourstring)) {
    echo 'Yes! It matches!';
    } 
else { 
echo 'No, it fails';
     }   // No, it fails

我总是尽量避免使用正则表达式,因此我对问题采取了另一种方法。 以下代码将测试密码中至少一个大写,一个小写和一位数字。

function isValidPassword($password)
{
    $hasUppercase = false;
    $hasLowercase = false;
    $hasDigit     = false;

    foreach (str_split($password) as $char)
    {
        $charAsciiValue = ord($char);

        if ($charAsciiValue >= ord('A') && $charAsciiValue <= ord('Z')) {
            $hasUppercase = true;
        }

        if ($charAsciiValue >= ord('a') && $charAsciiValue <= ord('z')) {
            $hasLowercase = true;
        }

        if ($charAsciiValue >= ord('0') && $charAsciiValue <= ord('9')) {
            $hasDigit = true;
        }
    }

    return $hasUppercase && $hasLowercase && $hasDigit;
}

var_dump(isValidPassword('Ab9c'));
var_dump(isValidPassword('abc'));

输出量

bool(true)
bool(false)

我提供了一个不同的解决方案,主要是因为regexp提供的错误报告很少,并且之后必须手动测试字符串的内聚性。 考虑将模式分开并添加自己的错误。 迭代每个需求,并测试模式。 将错误推送到数组中,然后检查错误是否存在。 为了使用if(validate_password($pass)):进行验证,将预声明的变量返回为true / false。 这是样机:

function validate_password($pass){
    $requirements = array();

    //uppercase
    $requirements['uppercase']['pattern'] = '/[A-Z]/';
    $requirements['uppercase']['error'] = 'Your password must contain at least one uppercase letter.';

    //lowercase
    $requirements['lowercase']['pattern'] = '/[a-z]/';
    $requirements['lowercase']['error'] = 'Your password must contain at least one lowercase letter.';

    //requires a number
    $requirements['number']['pattern'] = '/[0-9]/';
    $requirements['number']['error'] = 'Your password must contain at least one number.';

    //special characters
    $requirements['special_character']['pattern'] = '/[!@#$%^&*()\\-_=+{};\:,<\.>]/';
    $requirements['special_character']['error'] = 'Your password must contain at least one special character.';

    //length
    $requirements['length']['pattern'] = '/^.{8,}/';
    $requirements['length']['error'] = 'Your password must be at least 8 characters in length total.';



    $is_valid = false; //our flag to return as true once all tests have passed.
    $errors = false;

    //validate all requirements
    foreach($requirements as $idx => $req):
        if(preg_match($req['pattern'], $pass, $matches)):
            $is_valid = true;
        else:
            $errors[] = $req['error'];
            $is_valid = false;
        endif;
    endforeach;

    //if we had errors above
    if($errors):
        $is_valid = false;
        foreach($errors as $error):
            echo '<p>', $error, '</p>';
        endforeach;

    endif;
    return $is_valid;
}
$pass = 'j!Adz6'; //change this to test
echo validate_password($pass);

eval.in为您的乐趣例子。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM