2010-09-19 12 views
5

solo una pregunta rápida soy abit rubish con regex, así que pensé en publicar aquí. La siguiente expresión regular es para validar un nombre de usuario.php regex validación

  • debe tener entre 4-26 caracteres de longitud

  • de inicio con al menos 2 cartas

  • sólo puede contener números y un guión bajo y un punto

tengo este modo ahora, pero no está funcionando

<?php 

$username=$_POST['username']; 

if (!eregi("^([a-zA-Z][0-9_.]){4,26}$",$username)) 
{ 
return false; 
} 
else 
{ 
echo "username ok"; 
} 

?> 

Gracias :)

+9

'preg_match' es la manera preferida para llevar a cabo la expresión regular coincide. 'eregi' quedó en desuso a partir de PHP 5.3 y su uso es" muy desaconsejable ": http://php.net/eregi – rojoca

+0

No, no, gracias por el enlace – Elliott

+0

Por favor, dé algunos ejemplos de nombres de usuario válidos y no válidos. Sus reglas son contradictorias (al menos 2 letras frente a solo números). – kennytm

Respuesta

15

Usted podría utilizar la expresión regular

/^(?=[a-z]{2})(?=.{4,26})(?=[^.]*\.?[^.]*$)(?=[^_]*_?[^_]*$)[\w.]+$/iD 

como en

<?php 

$username=$_POST['username']; 

if (!preg_match('/^(?=[a-z]{2})(?=.{4,26})(?=[^.]*\.?[^.]*$)(?=[^_]*_?[^_]*$)[\w.]+$/iD', 
       $username)) 
{ 
return false; 
} 
else 
{ 
echo "username ok"; 
} 

?> 
  • El ^(?=[a-z]{2}) garantizar la cadena "Comience con al menos 2 letras".
  • El (?=.{4,26}) garantiza que "debe tener entre 4 y 26 caracteres de longitud".
  • El (?=[^.]*\.?[^.]*$) garantiza que los siguientes caracteres contengan como mucho un . hasta el final.
  • Igualmente (?=[^_]*_?[^_]*$) garantiza como máximo un _.
  • El [\w.]+$ se compromete con el partido. También asegura que solo se involucrarán los caracteres alfanuméricos, _ y ..

(Nota: esta expresión regular asume hello_world es un nombre de usuario válido.)

+0

Comience con más de dos letras y será perfecto :) "Comience con ** al menos ** 2 letras". –

+0

@Colin: Debería ser reparado. – kennytm

+0

Pero al mismo tiempo solo puede contener números, por lo que los últimos caracteres deben ser solo "\ d._" y no puede haber ningún número en la primera parte. Aquí hay una basada en su expresión regular anterior: –

0

La parte donde dice:

y uno guión bajo y un punto

que me alejarse de las expresiones regulares para ser honesto!

Me gustaría hacer algo como:

if(!eregi('^[a-zA-Z]{2}$', substr(0,2))) { 
    // .... check for only 2 dots here later .... 
} 
+0

jaja por qué .......? – Elliott

+0

Simplemente porque sería mucho más fácil escribir un código 'for/else' en este punto. Estoy seguro de que hay una expresión regular, ¡pero será complejo! –

+0

Buen punto, gracias por sus comentarios :) – Elliott

5

Usted está solicitando una gran cantidad en una expresión regular, esto puede ser posible, pero no es la mejor manera, desea que el usuario sepa por qué su nombre de usuario es error de salida.

function checkUsername($username) { 
    $username = trim($username); 
    if (empty($username)) { 
     return "username was left blank."; 
    }elseif (strlen($username) < 4) { 
     return "username was too short"; 
    }elseif (strlen($username) > 26) { 
     return "username was too long"; 
    }elseif (!preg_match('~^[a-z]{2}~i', $username)) { 
     return "username must start with two letters"; 
    }elseif (preg_match('~[^a-z0-9_.]+~i', $username)) { 
     return "username contains invalid characters."; 
    }elseif (substr_count($username, ".") > 1) { 
     return "username may only contain one or less periods."; 
    }elseif (substr_count($username, "_") > 1) { 
     return "username may only contain one or less underscores."; 
    } 

    return true; 
} 

A continuación, para comprobar que haría:

$validUsername = checkUsername($username); 

if ($validusername !== true) { 
    echo "An error occured: " . $validUsername; 
} 

De esta manera el usuario sabe que hubo un error y puede corregir más fácil en lugar de ser ciego a lo que es el error. También debe dejar de usar ereg que se ha depreciado use preg_match en su lugar.

NOTA el uso de! == para comprobar, esto también comprueba el tipo ya que puede devolver una cadena (que devolvería verdadero con una comparación suelta). Solo un FYI.

+0

Gracias, solo echo'd "nombre de usuario ok" ya que fue enviado de vuelta a la función jquery. Tenía una lista de los requisitos que el nombre de usuario necesita, pero supongo que tu camino es mejor. Lo daré hace un tiempo :) – Elliott

+0

Se agregó el requisito de 2 letras iniciales. –

+1

'preg_match ('~ [a-z0-9 _.] + ~ I', $ username)' devolverá '1' para' foo @ bar' como '[a-z0-9 _.] +' Coincide con 'foo' . – Gumbo