2009-05-18 3 views
1

Je souhaite vérifier un caractère illégal à l'aide de l'expression régulière suivante dans PHP. Essentiellement, je ne veux autoriser que les caractères alphanumériques et les traits de soulignement (_). Malheureusement, le code suivant ne semble pas fonctionner correctement. Cela devrait retourner true s'il y a un caractère illégal dans la chaîne $ username. Cependant, il permet toujours n'importe quel caractère dans la chaîne. Une idée de ce qui ne va pas avec l'expression régulière?Vérification de la chaîne pour les caractères non autorisés utilisant l'expression régulière

if (!preg_match("/^[-a-z0-9_]/i", $username)) 
{ 
    return true; 
} 

Merci d'avance.

Répondre

15

Votre code vérifie si le premier caractère n'est pas valide. Pour vérifier si des caractères non valides existent, annulez votre classe de personnage plutôt que le retour de la fonction et enlever l'ancre:

if (preg_match("/[^-a-z0-9_]/i", $username)) 
{ 
    return true; 
} 

Vous pouvez aussi, bien sûr, raccourcissent à /[^-\w]/ (caractères « mot » sont lettres, chiffres et le trait de soulignement), ou même simplement /\W/ si vous ne voulez pas autoriser les tirets.

+2

Cette solution est meilleure que celles correspondant à des chaînes entières, car preg_match peut retourner vrai dès qu'il rencontre un caractère non autorisé. Cependant, ce n'est pas grave sur quelque chose d'aussi court qu'un nom d'utilisateur. – Pianosaurus

+0

OTOH, les bonnes habitudes sont de bonnes habitudes. :-) –

1

Votre expression correspond à seulement 1 caractère. Essayez /^ [- a-z0-9 _] + $/i le '+' correspond à plus de 1 caractère et le '$' est l'ancre de fin de ligne

1

Vous devez également l'ancrer à la fin , au lieu de simplement vérifier le premier caractère. Essayez plutôt "/^[-a-z0-9_]*$/i".

0

Vous n'avez pas de répéteur pour un. Vous avez besoin d'un répéteur tel que +. Autant que je puisse voir sans l'exécuter, vous vérifiez le début de la ligne et un caractère correspondant à a-zA-Z0-9 et _ mais rien ne suit ce premier caractère.

2

Si $username ne possède alphanumérique et le souligner retournera TRUE

if (preg_match("/^[a-z0-9_]+$/i", $username)) 
{ 
    return true; 
} 
Questions connexes