Solución:
Creo que esto debería verse así:
if(!preg_match('/^(?=.*d)(?=.*[A-Za-z])[[email protected]#$%]{8,12}$/', $password)) {
echo 'the password does not meet the requirements!';
}
Entre inicio -> ^
Y final -> $
de la cadena tiene que haber al menos un número -> (?=.*d)
y al menos una letra -> (?=.*[A-Za-z])
y tiene que ser un número, una letra o uno de los siguientes: [email protected]# $% -> [[email protected]#$%]
y tiene que haber 8-12 caracteres -> {8,12}
Como el usuario 557846 comentó su pregunta, también le sugiero que permita más caracteres, por lo general (si uso un máximo) tomo al menos 50 🙂
por cierto, es posible que desee echar un vistazo a este tutorial de expresiones regulares
preg_match('/^(?=.*d)(?=.*[@#-_$%^&+=§!?])(?=.*[a-z])(?=.*[A-Z])[[email protected]#-_$%^&+=§!?]{8,20}$/',$password)
- al menos un carácter en minúscula
- al menos un carácter en mayúsculas
- al menos un dígito
- al menos un signo especial de @ # -_ $% ^ & + = § !?
Me gustó la respuesta de r3bel, así que jugué con ella y terminé con lo siguiente como función de verificación de contraseña:
function password_strength_check($password, $min_len = 8, $max_len = 70, $req_digit = 1, $req_lower = 1, $req_upper = 1, $req_symbol = 1) {
// Build regex string depending on requirements for the password
$regex = '/^';
if ($req_digit == 1) { $regex .= '(?=.*d)'; } // Match at least 1 digit
if ($req_lower == 1) { $regex .= '(?=.*[a-z])'; } // Match at least 1 lowercase letter
if ($req_upper == 1) { $regex .= '(?=.*[A-Z])'; } // Match at least 1 uppercase letter
if ($req_symbol == 1) { $regex .= '(?=.*[^a-zA-Zd])'; } // Match at least 1 character that is none of the above
$regex .= '.{' . $min_len . ',' . $max_len . '}$/';
if(preg_match($regex, $password)) {
return TRUE;
} else {
return FALSE;
}
}
Las longitudes máximas / mínimas son predeterminadas o ajustables, cada requisito está activado de forma predeterminada, pero se puede desactivar, y quería admitir cualquier símbolo, por lo que el último requisito es “cualquier cosa que no sea uno de los tipos anteriores”, en lugar de fijo conjunto de símbolos.