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?

34
demandé sur Gumbo 2009-08-26 00:14:13

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]+)*$/
66
répondu Gumbo 2009-08-25 20:26:33

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

?>
16
répondu ifreelancer.asia 2013-06-16 15:34:56

Essayez

function validate_alphanumeric_underscore($str) 
{
    return preg_match('/^[a-zA-Z0-9_]+$/',$str);
}
10
répondu Phill Pafford 2009-08-25 20:16:37

Ça me semble bien. Notez que vous n'exigez pas le placement du trait de soulignement, donc "username_" et "___username" passeraient tous les deux.

3
répondu Lucas Oman 2009-08-25 20:17:54

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]+)*$/

1
répondu André Catita 2013-01-14 16:44:25

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)

0
répondu Sebastian Paaske Tørholm 2009-08-25 20:26:33