Valider le nom d'utilisateur comme alphanumérique avec des traits de soulignement
Sur ma page d'inscription, je dois valider les noms d'utilisateur en tant qu'alphanumérique uniquement, mais aussi avec des traits de soulignement facultatifs. Je suis venu avec ceci:
function validate_alphanumeric_underscore($str)
{
return preg_match('/^w+$/',$str);
}
Ce qui semble fonctionner correctement, mais je ne suis pas un expert en regex! Personne ne place aucun problème?
6 réponses
Les caractères correspondants de \w
dépendent des paramètres régionaux utilisés:
"word" de caractère est une lettre ou un chiffre ou le caractère de soulignement, c'est-à-dire un caractère qui peut être partie d'un Perl "mot". La définition des lettres et des chiffres est contrôlée par les tables de caractères de PCRE et peut varier si une correspondance spécifique aux paramètres régionaux est effectuée. Par exemple, dans les paramètres régionaux "fr" (Français), certains codes de caractères supérieurs à 128 sont utilisés pour lettres accentuées, et celles-ci sont assorties par \W.
Vous devriez donc mieux spécifier explicitement les caractères que vous voulez autoriser:
/^[A-Za-z0-9_]+$/
Cela permet uniquement les caractères alphanumériques et le trait de soulignement.
Et si vous voulez autoriser le trait de soulignement uniquement en tant que caractère de concaténation et que vous voulez forcer que le nom d'utilisateur doit commencer par un caractère alphabet:
/^[A-Za-z][A-Za-z0-9]*(?:_[A-Za-z0-9]+)*$/
Voici une fonction personnalisée pour valider la chaîne en utilisant le PHP ctype_alnum en conjonction avec un tableau de caractères autorisés:
<?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;
}
}
?>
Essayez
function validate_alphanumeric_underscore($str)
{
return preg_match('/^[a-zA-Z0-9_]+$/',$str);
}
Ça me semble bien. Notez que vous n'exigez pas le placement du trait de soulignement, donc "username_" et "___username" passeraient tous les deux.
Je prendrais la regex secondaire de gumbo, pour autoriser uniquement le trait de soulignement comme concaténation, mais ajouter un + après le _ afin qu'un utilisateur puisse être comme "special__username", juste un tweak mineur.
/^[A-Za-z][A-Za-z0-9]*(?:_+[A-Za-z0-9]+)*$/
Votre propre solution est parfaitement bien.
preg_match
utilise des expressions régulières de type Perl, dans lesquelles la classe de caractères \w
est définie pour correspondre exactement à ce dont vous avez besoin:
\w
- correspond à un caractère " mot "(alphanumérique plus"_")
(source)