密码强度检测程序需满足长度≥8、含大小写字母、数字及特殊字符;使用str_contains与ctype_*函数遍历校验,返回有效性和错误列表。

PHP 8.2 中实现一个简单但实用的密码强度检测程序,核心是判断输入密码是否满足基本安全要求:长度、大小写字母、数字、特殊字符。不需要第三方库,用原生函数即可完成。
基础校验规则设定
通常建议的最低强度标准包括:
- 密码长度 ≥ 8 位
- 至少含 1 个小写字母(a–z)
- 至少含 1 个大写字母(A–Z)
- 至少含 1 个数字(0–9)
- 至少含 1 个常见特殊字符(如 !@#$%^&* 等)
使用 str_contains + ctype_* 组合判断(推荐 PHP 8.0+)
PHP 8.2 支持 str_contains() 和更严格的类型推导,适合清晰表达逻辑。配合 ctype_lower()、ctype_upper()、ctype_digit() 可高效检测单字符类型,但注意这些函数只适用于单字符,需遍历字符串:
function checkPasswordStrength(string $pwd): array
{
$errors = [];
$len = strlen($pwd);
<pre class="brush:php;toolbar:false;">if ($len < 8) {
$errors[] = '密码长度不能少于 8 位';
}
$hasLower = $hasUpper = $hasDigit = $hasSpecial = false;
$specialChars = '!@#$%^&*()_+-=[]{}|;:,.<>?';
for ($i = 0; $i < $len; $i++) {
$char = $pwd[$i];
if (ctype_lower($char)) $hasLower = true;
elseif (ctype_upper($char)) $hasUpper = true;
elseif (ctype_digit($char)) $hasDigit = true;
elseif (str_contains($specialChars, $char)) $hasSpecial = true;
}
if (!$hasLower) $errors[] = '需包含至少 1 个小写字母';
if (!$hasUpper) $errors[] = '需包含至少 1 个大写字母';
if (!$hasDigit) $errors[] = '需包含至少 1 个数字';
if (!$hasSpecial) $errors[] = '需包含至少 1 个特殊字符';
return [
'valid' => empty($errors),
'errors' => $errors,
'score' => 4 - count($errors) // 满分 4(字母大小写/数字/符号),长度另计
];}
立即学习“PHP免费学习笔记(深入)”;
增强版:用正则一次提取特征(简洁但稍慢)
若偏好正则,可用 preg_match() 分别检查各类字符是否存在。PHP 8.2 对 PCRE2 支持更好,性能稳定:
function checkPasswordWithRegex(string $pwd): array
{
$errors = [];
if (strlen($pwd) < 8) {
$errors[] = '密码长度不能少于 8 位';
}
if (!preg_match('/[a-z]/', $pwd)) {
$errors[] = '需包含至少 1 个小写字母';
}
if (!preg_match('/[A-Z]/', $pwd)) {
$errors[] = '需包含至少 1 个大写字母';
}
if (!preg_match('/[0-9]/', $pwd)) {
$errors[] = '需包含至少 1 个数字';
}
if (!preg_match('/[!@#$%^&*()_+\-=\[\]{}|;:,.<>?]/', $pwd)) {
$errors[] = '需包含至少 1 个特殊字符';
}
<pre class="brush:php;toolbar:false;">return [
'valid' => empty($errors),
'errors' => $errors
];}
立即学习“PHP免费学习笔记(深入)”;
实际调用与反馈示例
在表单验证中直接使用,返回结构化结果便于前端提示:
$result = checkPasswordStrength($_POST['password'] ?? '');
if (!$result['valid']) {
foreach ($result['errors'] as $msg) {
echo '<font color="red">✘ ' . htmlspecialchars($msg) . "</font><br>\n";
}
} else {
echo '<font color="green">✓ 密码符合要求</font>';
}



















