Question

Sur ma page d'inscription que je dois valider les noms d'utilisateur comme alphanumérique seulement, mais aussi avec des underscores en option. Je suis venu avec ceci:

function validate_alphanumeric_underscore($str) 
{
    return preg_match('/^\w+$/',$str);
}

Ce qui semble fonctionner très bien, mais je ne suis pas un expert en regex! Est-ce que quelqu'un tache problème?

Était-ce utile?

La solution

réelle en correspondance des caractères de \w dépendent de la localisation qui est utilisé:

  

Un « mot » caractère est une lettre ou un chiffre ou le caractère de soulignement, c'est un caractère qui peut faire partie d'un Perl « mot ». La définition des lettres et des chiffres est contrôlé par les tables de caractères de PCRE, et peut varier suivant l'appariement des 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 pour les caractères accentués, et ceux-ci sont mis en correspondance par \ w.

Vous devez donc mieux préciser explicitement ce que les caractères que vous souhaitez autoriser:

/^[A-Za-z0-9_]+$/

Cela permet à des caractères alphanumériques juste et le trait de soulignement.

Et si vous voulez autoriser underscore seulement comme caractère de concaténation et que vous voulez forcer que le nom d'utilisateur doit commencer par un caractère alphabétique:

/^[A-Za-z][A-Za-z0-9]*(?:_[A-Za-z0-9]+)*$/

Autres conseils

Voici une fonction personnalisée pour valider la chaîne en utilisant le PHP ctype_alnum en liaison 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);
}

On dirait bien pour moi. Notez que vous ne faites aucune exigence pour la mise en place du trait de soulignement, de sorte que « username_ » et « ___username » serait à la fois passe.

Je prendrais regex secondaire gombo, pour permettre que underscore comme concaténation, mais ajouter un + après le _ de sorte qu'un utilisateur peut ê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 Perl comme, dans lequel le \w de classe de caractères définis pour correspondre exactement ce dont vous avez besoin:

  

\w - Faites correspondre un caractère "mot" (alphanumérique plus "_")

( la source )

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top