web-dev-qa-db-fra.com

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

35
MDM

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

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

?>
16
ifreelancer.asia

essayer

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

Ç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.

3
Lucas Oman

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

1
André Catita

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 )