2009-08-25 35 views
33

En mi página de registro, necesito validar los nombres de usuario como alfanuméricos solamente, pero también con guiones bajos opcionales. He llegado a esto:Validar nombre de usuario como alfanumérico con guiones bajos

function validate_alphanumeric_underscore($str) 
{ 
    return preg_match('/^\w+$/',$str); 
} 

Lo que parece funcionar bien, pero no soy un experto en expresiones regulares. ¿Alguien detecta algún problema?

+0

esto permitirá guiones y creo períodos, así –

+0

Creo que los espacios en blanco, así que podría ser válida con \ w –

+0

Para PRE, \ w Coincide con un carácter "palabra" (alfanuméricos más "_"), de acuerdo con la documentación oficial de Perl: http://www.perl.com/doc/manual/html/pod/perlre.html –

Respuesta

65

El actual matched characters of \w depend on the locale que se utiliza:

Una "palabra" carácter es cualquier letra o dígito o el carácter de subrayado, es decir, cualquier carácter que puede ser parte de un Perl "palabra ". La definición de letras y dígitos está controlada por las tablas de caracteres de PCRE, y puede variar si se lleva a cabo una coincidencia específica de la configuración regional. Por ejemplo, en la configuración regional "fr" (francés), algunos códigos de caracteres superiores a 128 se utilizan para letras acentuadas, y éstas se corresponden con \ w.

por lo que debe especificar explícitamente lo mejor caracteres que desea permitir:

/^[A-Za-z0-9_]+$/ 

Esto permite sólo caracteres alfanuméricos y el guión bajo.

Y si desea permitir subrayado sólo como caracteres de concatenación y quiere forzar a que el nombre de usuario debe comenzar con un carácter alfabético:

/^[A-Za-z][A-Za-z0-9]*(?:_[A-Za-z0-9]+)*$/ 
+1

¿Por qué?\ w es exactamente caracteres alfanuméricos y guión bajo. –

+11

En realidad, \ w son caracteres alfanuméricos y guiones bajos según la configuración regional activa, por lo que, dependiendo de las circunstancias, puede coincidir con caracteres como 'ü' o 'ö'. –

+1

@af, ah, tienes razón. ¡Gracias por la corrección! –

10

tratar

function validate_alphanumeric_underscore($str) 
{ 
    return preg_match('/^[a-zA-Z0-9_]+$/',$str); 
} 
3

se ve bien para mí. Tenga en cuenta que no exige que se coloque el guión bajo, por lo que "username_" y "___username" pasarán.

+0

¿Podría decirme cómo establecer el límite para un guión bajo entre las letras? – AlexioVay

0

Su propia solución está perfectamente bien.

preg_match utiliza expresiones regulares de Perl, en el que la clase de caracteres \w se define para que coincida exactamente lo que necesita:

\w - un carácter de "palabra" (alfanuméricos más "_")

(source)

16

Aquí es una función personalizada para validar la cadena utilizando el PHP ctype_alnum en conjunción con una serie o f permitió caracteres:

<?php 

$str = ""; 
function validate_username($str) { 

    // each array entry is an special char allowed 
    // besides the ones from ctype_alnum 
    $allowed = array(".", "-", "_"); 

    if (ctype_alnum(str_replace($allowed, '', $str))) { 
    return $str; 
    } else { 
    $str = "Invalid Username"; 
    return $str; 
    } 
} 

?> 
+4

En general, me gusta evitar expresiones regulares donde puedo. Para este tipo de validación, esto parece menos propenso a errores y es más fácil de entender (el desarrollador solo necesita saber php, no necesita conocer la sintaxis de expresiones regulares). La solución es exclusiva de php, pero eso es lo que estoy buscando. Gracias. –

1

me gustaría tener expresiones regulares secundaria de gumbo, para que sólo permita subrayado como concatenación, pero añadir a + _ después de la manera que un usuario puede ser como "special__username", sólo un pequeño ajuste.

/^[A-Za-z][A-Za-z0-9]*(?:_+[A-Za-z0-9]+)*$/

Cuestiones relacionadas