2009-08-03 9 views
10

Je cherche une regex qui vérifiera si la chaîne se compose uniquement des lettres az, numbers, souligner (_) et trait d'union (-). J'ai essayé ceci, mais cela ne fonctionne pas:Besoin d'une regex qui vérifiera si la chaîne ne contient que des lettres az et des chiffres et des traits de soulignement (_) et trait d'union (-)

if (!preg_match('/^a-zA-Z0-9_-$/', $string)) { 
    $reg_Error[] = 2; 
} 

Aussi, puis-je vérifier la longueur avec regex? Sinon, je vais le faire avec PHP.

+2

Vérifiez la longueur avec strlen. Regex est un outil, pas un marteau. :) – OIS

Répondre

1

Le regex doit être: '^ [\ w \ d -] + $'

+1

Pour expliquer cela: '-' est un caractère spécial entre crochets * à moins que * soit le premier ou le dernier caractère entre crochets. –

+0

'a-zA-Z_' peut être remplacé par' \ w', '0-9' peut être remplacé par' \ d' – RaYell

+1

'a-zA-Z0-9_' peut être remplacé par' \ w' seulement. –

3

Shortest un:

/^ [\ w -] + $/

+1

Encore plus court: '/^[\ w -] + $ /' – RaYell

+0

Et où est le trait de soulignement ?? – seize

+1

Le trait de soulignement fait partie de '\ w'. –

14

Vous devez mettre votre regex /^a-zA-Z0-9_-$/ dans une classe de caractères /[...]/.
Cela signifie que vous pouvez faire correspondre n'importe quel caractère dans la classe de caractères. Vous devez également spécifier un quantificateur car /^[a-zA-Z0-9_-]$/ correspondra à un seul caractère.

Exemples:
/^[a-zA-Z0-9_-]+$/ avec le signe + vous le faire correspondre une ou plusieurs fois
/^[a-zA-Z0-9_-]{1,}$/ comme ci-dessus
/^[a-zA-Z0-9_-]{10,20}$/ entre 10 et 20 caractères de long. Il doit être exactement 15 caractères de long. Vous pouvez l'utiliser pour vérifier la longueur de la chaîne.

Vous pouvez également utiliser le mot-clé suivant pour rendre votre regex facile à lire:
/^[\w-]+$/ qui correspond à un caractère de mot (y compris soulignement, des lettres et des chiffres) ou un tiret, une ou plusieurs fois.

1

Les réponses afin d'expliquer bien correctement la classe de caractères/^[A-Za-z0-9_-]+$/

Vous pouvez vérifier la longueur. + signifie "un ou plusieurs des précédents", * signifie zéro ou plus des précédents "et {2,4} signifie" entre 2 et 4 des précédents "

Vous ne pouvez pas spécifier la longueur doit Cependant, spécifier que la longueur doit être paire est possible mais non triviale:/^(xx){1,3}$/correspond à xx, xxxx ou xxxxxx Le nombre de paires correspond à nombre de paires, pas le nombre de x'es

6

J'utiliser celui-ci:

/^[a-z_\-\d]+$/i 

Quant à savoir pourquoi je ne suis pas en utilisant \w, le suivant qu OTE, pris de PHP PCRE Pattern Reference, devrait expliquer pourquoi vous ne devriez pas utiliser \w dans cette situation:

caractère Un « mot » est une lettre ou un chiffre ou le caractère de soulignement, c'est un caractère qui peut faire partie d'un "mot" Perl. 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 a lieu. 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 ceux-ci correspondent à \w.

Ce comportement n'est pas souhaitable dans ce cas, sauf si vous voulez vous soucier locale, utiliser des classes de caractères droite au lieu de la sténographie \w.

Si vous souhaitez spécifier une longueur minimale (par exemple 3):

/^[a-z_\-\d]{3,}$/i 

Si vous souhaitez spécifier une longueur minimale et maximale (par exemple 2 et 5):

/^[a-z_\-\d]{2,5}$/i 
Questions connexes