2012-04-18 32 views
5

Tengo esta expresión en un fragmento de código que tomé prestado sin conexión. Obliga a los nuevos usuarios a tener una contraseña que no solo requiere números superiores + inferiores + sino que debe estar en ese orden. Si ingreso los números más bajos + superiores, ¡falla!¿Qué significan los símbolos en preg_match?

if (preg_match("/^.*(?=.{4,})(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]).*$/", $pw_clean, $matches)) { 

Ive buscado en línea pero no puede encontrar un recurso que me diga qué significan algunos caracteres. Puedo ver que el patrón es preg_match ("/ some expression /", yourstring, tu coincidencia).

¿Qué hacen estos media:

1.^  - ??? 
2. .*   - ??? 
3. (?=.{4,}) - requires 4 characters minimum 
4. (?.*[0-9]) - requires it to have numbers 
5. (?=.*[a-z])- requires it to have lowercase 
6. (?=.*[A-Z])- requires it to have uppercase 
7. .*$  - ??? 
+0

Busque en Google los tutoriales Reg Ex –

+0

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

+0

Dado que está etiquetando este PHP: http://php.net/manual/en/book.pcre.php –

Respuesta

13

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/

+0

Thx ccondrup. Supongo que entiendo tus explicaciones, pero si no es demasiado problema, id como una explicación de por qué la expresión completa funciona de la forma en que lo hace para complicar tanto la validación de tu contraseña ... – marciokoko

+0

Me alegra oír que sea comprensible. Agregué más a mi respuesta, vea si eso ayuda a – ccondrup

+0

¿Qué significa 'preg_match (. *?)'? – Neocortex

1

Para usar expresiones regulares primero que hay que aprender la sintaxis . Esta sintaxis consiste en una serie de letras, números, puntos, guiones y signos especiales, que podemos agrupar utilizando diferentes paréntesis.

Mira este enlace Getting Started with PHP Regular Expressions. Una forma fácil de aprender expresiones regulares.

Cuestiones relacionadas