Sur ma page d'inscription, je dois valider les noms d'utilisateur uniquement en alphanumérique, 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 bien fonctionner, mais je ne suis pas un expert en regex! Quelqu'un voit-il un problème?
Les caractères correspondants réels de \w
dépend des paramètres régionaux utilisés:
Un caractère "Word" est une lettre ou un chiffre ou le caractère de soulignement, c'est-à-dire tout caractère pouvant faire partie d'un Perl " Word ". 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 en cours. Par exemple, dans les paramètres régionaux "fr" (français), certains codes de caractères supérieurs à 128 sont utilisés pour les lettres accentuées, et ils sont mis en correspondance par\w.
Il est donc préférable de spécifier explicitement les caractères que vous souhaitez autoriser:
/^[A-Za-z0-9_]+$/
Cela autorise uniquement les caractères alphanumériques et le trait de soulignement.
Et si vous souhaitez autoriser le soulignement uniquement en tant que caractère de concaténation et que vous souhaitez forcer le nom d'utilisateur à commencer par un caractère alphabétique:
/^[A-Za-z][A-Za-z0-9]*(?:_[A-Za-z0-9]+)*$/
Voici une fonction personnalisée pour valider la chaîne en utilisant 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;
}
}
?>
essayer
function validate_alphanumeric_underscore($str)
{
return preg_match('/^[a-zA-Z0-9_]+$/',$str);
}
Ça me va bien. Notez que vous ne faites aucune exigence pour le placement du trait de soulignement, donc "username" et "___ username" passeraient tous les deux.
Je prendrais le regex secondaire de gumbo, pour n'autoriser que le soulignement comme concaténation, mais ajouter un + après le _ pour 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
défini pour correspondre exactement à ce dont vous avez besoin:
\w
- Correspond à un caractère "Word" (alphanumérique plus "_")
( source )