regular preg_match_all preg_match online examples ejemplos php regex preg-match

php - preg_match_all - Validar nombre de usuario como alfanumérico con guiones bajos



regex preg_match_all (6)

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

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

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


Aquí hay una función personalizada para validar la cadena utilizando el PHP ctype_alnum junto con una matriz de caracteres permitidos:

<?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; } } ?>


Los caracteres coincidentes reales de /w dependen de la configuración regional que se utiliza:

Un carácter de "palabra" es cualquier letra o dígito o el carácter de guión bajo, es decir, cualquier carácter que pueda ser parte de una " palabra " de Perl. 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 tanto, debería especificar mejor qué caracteres desea permitir:

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

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

Y si desea permitir el subrayado solo como carácter de concatenación y quiere forzar que el nombre de usuario debe comenzar con un carácter de alfabeto:

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


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


Tomaría la expresión regular secundaria de Gumbo, para permitir solo el guión bajo como concatenación, pero agregue un + después de _ para que un usuario pueda ser como "nombre_usuario especial", solo un pequeño ajuste.

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


Tu propia solución está perfectamente bien.

preg_match usa expresiones regulares similares a Perl, en las que la clase de caracteres /w define para que coincida exactamente con lo que necesita:

/w - Coincide con un carácter de "palabra" (alfanumérico más "_")

( source )


tratar

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