PHP密码强度校验正则

wen PHP项目 1

本文目录导读:

PHP密码强度校验正则

  1. 基础密码强度校验(至少8位,包含字母和数字)
  2. 中等级密码强度(至少8位,包含大小写字母、数字)
  3. 强密码(至少8位,包含大小写字母、数字、特殊字符)
  4. 完整的密码强度检查函数
  5. 分级密码强度检查
  6. 单行正则解法(综合强度)
  7. 使用建议

我来给你提供几种不同需求的PHP密码强度校验正则表达式:

基础密码强度校验(至少8位,包含字母和数字)

$pattern = '/^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,}$/';

中等级密码强度(至少8位,包含大小写字母、数字)

$pattern = '/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$/';

强密码(至少8位,包含大小写字母、数字、特殊字符)

$pattern = '/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/';

完整的密码强度检查函数

function checkPasswordStrength($password) {
    $errors = [];
    // 长度检查(至少8位)
    if (strlen($password) < 8) {
        $errors[] = '密码长度至少8位';
    }
    // 包含小写字母
    if (!preg_match('/[a-z]/', $password)) {
        $errors[] = '必须包含小写字母';
    }
    // 包含大写字母
    if (!preg_match('/[A-Z]/', $password)) {
        $errors[] = '必须包含大写字母';
    }
    // 包含数字
    if (!preg_match('/\d/', $password)) {
        $errors[] = '必须包含数字';
    }
    // 包含特殊字符
    if (!preg_match('/[@$!%*?&#^_+\-=.~`\[\]{}|;:",<>\'\\\\]/', $password)) {
        $errors[] = '必须包含特殊字符';
    }
    // 检查连续重复字符(可选)
    if (preg_match('/(.)\1{2,}/', $password)) {
        $errors[] = '不能有连续3个相同字符';
    }
    // 检查常见弱密码
    $weakPasswords = ['password', '12345678', 'qwerty', 'admin', 'letmein'];
    if (in_array(strtolower($password), $weakPasswords)) {
        $errors[] = '密码过于常见';
    }
    return $errors;
}
// 使用示例
$password = "Abcd1234!@#";
$errors = checkPasswordStrength($password);
if (empty($errors)) {
    echo "密码强度合格";
} else {
    echo "密码不满足要求:\n";
    foreach ($errors as $error) {
        echo "- " . $error . "\n";
    }
}

分级密码强度检查

function getPasswordStrength($password) {
    $score = 0;
    // 长度评分
    if (strlen($password) >= 8) $score += 1;
    if (strlen($password) >= 12) $score += 1;
    if (strlen($password) >= 16) $score += 1;
    // 字符类型评分
    if (preg_match('/[a-z]/', $password)) $score += 1;
    if (preg_match('/[A-Z]/', $password)) $score += 1;
    if (preg_match('/\d/', $password)) $score += 1;
    if (preg_match('/[@$!%*?&]/', $password)) $score += 1;
    // 多样性评分
    $uniqueChars = count(array_unique(str_split($password)));
    if ($uniqueChars > 8) $score += 1;
    // 评分等级
    if ($score >= 8) return '强';
    if ($score >= 6) return '中';
    if ($score >= 4) return '弱';
    return '极弱';
}
// 使用示例
$passwords = ['a1B2c3D4!', 'password', 'Abcd1234!@#', 'abc'];
foreach ($passwords as $pwd) {
    echo $pwd . " -> " . getPasswordStrength($pwd) . "\n";
}

单行正则解法(综合强度)

// 强密码(全部条件都满足)
$strong_pattern = '/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%^&*])[a-zA-Z\d!@#$%^&*]{8,}$/';
// 中等密码(至少两类字符+长度)
$medium_pattern = '/^(?:(?=.*[a-z])(?=.*[A-Z])|(?=.*[a-z])(?=.*\d)|(?=.*[A-Z])(?=.*\d)).{8,}$/';
// 验证
if (preg_match($strong_pattern, $password)) {
    echo "强密码";
} elseif (preg_match($medium_pattern, $password)) {
    echo "中等密码";
} else {
    echo "弱密码";
}

使用建议

  1. 根据实际需求选择正则模式,不必过分复杂
  2. 建议使用函数封装,便于维护和测试
  3. 考虑用户体验,给出具体的密码要求提示
  4. 结合其他验证,如密码确认等

选择哪种方案取决于你的安全需求和用户体验要求。

抱歉,评论功能暂时关闭!