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