Estas son las respuestas directas. Los mantuve cortos porque no tendrán sentido sin una comprensión de la expresión regular. Esa comprensión se gana mejor en regular-expressions.info. Te aconsejo que también pruebes el regex helper tools que figura en la lista, te permiten experimentar: ver la captura/coincidencia en vivo mientras editas el patrón, muy útil.
1: El símbolo de intercalación ^
es un ancla, que significa "el comienzo de la pajar/cadena/línea".
- Si un símbolo de intercalación es el primer símbolo dentro de una clase de caracteres
[]
, tiene un significado diferente: anula la clase. (Así que en [^ab]
el cursor hace que el partido de la clase algo que es no ab)
2: El punto .
y el asterisco *
servir a dos propósitos diferentes:
- El punto coincide con cualquier carácter individual excepto newline
\n
.
- El asterisco dice "permitir cero o muchos del tipo anterior".
Cuando estos dos se combinan como .*
, básicamente dice "cero o más de cualquier cosa hasta que entre en vigor una nueva línea u otra regla".
7: El dólar $
es también un anclaje similar al caret, con la función opuesta: "al final del pajar".
Editar:
paréntesis simples ()
alrededor de algo hace que sea un grupo. Aquí tiene (?=)
que es una afirmación, específicamente una afirmación de positiva anticipada. Todo lo que hace es verificar si lo que hay adentro realmente existe hacia adelante desde la posición actual del cursor en el pajar. ¿Aún conmigo?
Ejemplo:foo(?=bar)
coincide con foo
solo si va seguido de bar
. bar
nunca coincide, solo se devuelve foo
.
Con esto en mente, vamos a diseccionar su expresión regular:
/^.*(?=.{4,})(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]).*$/
Reads as:
^.* From Start, capture 0-many of any character
(?=.{4,}) if there are at least 4 of anything following this
(?=.*[0-9]) if there is: 0-many of any, ending with an integer following
(?=.*[a-z]) if there is: 0-many of any, ending with a lowercase letter following
(?=.*[A-Z]) if there is: 0-many of any, ending with an uppercase letter following
.*$ 0-many of anything preceding the End
Usted dice que el orden de los caracteres de la contraseña importa - no lo hace en mis pruebas. Ver el script de prueba a continuación. Espero que esto aclare una o dos cosas. Si usted está buscando otra expresión regular que es un poco más indulgente, ver regex password validation
<pre>
<?php
// Only the last 3 fail, as they should. You claim the first does not work?
$subjects = array("aaB1", "Baa1", "1Baa", "1aaB", "aa1B", "aa11", "aaBB", "aB1");
foreach($subjects as $s)
{
$res = preg_match("/^.*(?=.{4,})(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]).*$/", $s, $matches);
echo "result: ";
print_r($res);
echo "<br>";
print_r($matches);
echo "<hr>";
}
excelente herramienta en línea para comprobar y probar expresiones regulares: https://regex101.com/
Busque en Google los tutoriales Reg Ex –
No relacionado con su pregunta real, pero forzar a las personas a tener un patrón excesivamente complicado para una contraseña probablemente les obligue a escribirlo en alguna parte, eliminando la seguridad de una contraseña. – jprofitt
Dado que está etiquetando este PHP: http://php.net/manual/en/book.pcre.php –