segura - validar contraseñas iguales php
Expresión regular de PHP para validación de contraseña segura (3)
Esta pregunta ya tiene una respuesta aquí:
- Referencia - Validación de contraseña 1 respuesta
He visto la siguiente expresión regular en la web.
(?=^.{8,}$)((?=.*/d)|(?=.*/W+))(?![./n])(?=.*[A-Z])(?=.*[a-z]).*$
Se valida solo si la cadena:
* contain at least (1) upper case letter
* contain at least (1) lower case letter
* contain at least (1) number or special character
* contain at least (8) characters in length
Me gustaría saber cómo convertir esta expresión regular para que compruebe la cadena a
* contain at least (2) upper case letter
* contain at least (2) lower case letter
* contain at least (2) digits
* contain at least (2) special character
* contain at least (8) characters in length
Bueno, si contiene al menos 2 dígitos superiores e inferiores y caracteres especiales, no necesitaría la longitud de 8 caracteres.
Los caracteres especiales incluyen:
`~! @ # $% ^ & * () _- + = [] / | {} ;: ''"., / <>?
La mejor manera de adaptar esa expresión regular es tirarla y escribir un código en su lugar. La expresión regular requerida sería tan larga y complicada que no podría leerla dos horas después de haberla escrito. El código PHP equivalente será tedioso, pero al menos podrás entender lo que escribiste.
Por cierto, esto no es un golpe para ti. Los regex son apenas aptos para la validación de la seguridad de la contraseña en la mayoría de los casos, pero sus requisitos son más complicados de lo habitual y no vale la pena. Además, esa expresión regular que publicaste es una mierda. Nunca confíes en las expresiones regulares que encuentres flotando alrededor de la web. O cualquier código, para el caso. O, diablos, cualquier cosa . : - /
Si realmente quieres usar una expresión regular, prueba esto:
(?=^(?:[^A-Z]*[A-Z]){2})(?=^(?:[^a-z]*[a-z]){2})(?=^(?:/D*/d){2})(?=^(?:/w*/W){2})^[A-Za-z/d/W]{8,}$
Alguna explicación:
-
(?=^(?:[^AZ]*[AZ]){2})
prueba dos repeticiones de[^AZ]*[AZ]
que es una secuencia de cero o más caracteres, excepto las letras mayúsculas seguidas de una letra mayúscula -
(?=^(?:[^az]*[az]){2})
(igual que arriba con letras minúsculas) -
(?=^(?:/D*/d){2})
(igual que arriba con dígitos) -
(?=^(?:/w*/W){2})
(igual que arriba con caracteres que no son palabras, pero puede cambiar/W
con una clase de caracteres de cualquier carácter especial que desee) -
^[A-Za-z/d/W]{8,}$
prueba la longitud de toda la cadena que consiste solo en el carácter de la unión de todas las demás clases de caracteres.
Tengo que estar de acuerdo con Alan. Si la expresión regular existente es tan complicada, ¿por qué intentarlo en una sola expresión regular?
Solo divídelo en pasos simples y accesibles. Ya lo has hecho.
Ahora escriba 4 regex para validar sus partes, agregue lógica básica a las 4 regex y mida la longitud de la cadena. Hecho.
Que prefieres depurar, esto:
(?=^(?:[^AZ]*[AZ]){2})(?=^(?:[^az]*[az]){2})(?=^(?:/D*/d){2})(?=^(?:/w*/W){2})^[A-Za-z/d/W]{8,}$
(que no funciona por cierto ... )
o esto:
function valid_pass($candidate) {
$r1=''/[A-Z]/''; //Uppercase
$r2=''/[a-z]/''; //lowercase
$r3=''/[!@#$%^&*()/-_=+{};:,<.>]/''; // whatever you mean by ''special char''
$r4=''/[0-9]/''; //numbers
if(preg_match_all($r1,$candidate, $o)<2) return FALSE;
if(preg_match_all($r2,$candidate, $o)<2) return FALSE;
if(preg_match_all($r3,$candidate, $o)<2) return FALSE;
if(preg_match_all($r4,$candidate, $o)<2) return FALSE;
if(strlen($candidate)<8) return FALSE;
return TRUE;
}
¿Por qué la gente siente que tiene que escribir una expresión regular que nadie puede entender solo para que puedan hacerlo de una sola vez?
Ok, ok, si realmente quieres una expresión regular, aprende sobre lookaheads para validar tus reglas.
Este monstruo hace lo que pediste de una sola vez:
^ # start of line
(?=(?:.*[A-Z]){2,}) # 2 upper case letters
(?=(?:.*[a-z]){2,}) # 2 lower case letters
(?=(?:.*/d){2,}) # 2 digits
(?=(?:.*[!@#$%^&*()/-_=+{};:,<.>]){2,}) # 2 special characters
(.{8,}) # length 8 or more
$ # EOL