2010-02-18 3 views
9

Programmation récente en PHP, je pensais avoir une expression régulière Perl qui fonctionnait mais quand je l'ai vérifiée par rapport à ce que je voulais, ça n'a pas marché.Expressions régulières Perl pour correspondre à un hachage MD5?

Quelle est la bonne expression pour vérifier si quelque chose est un MD5 a (hexadécimal à 32 chiffres de a-z et 0-9).

Actuellement, j'ai /^[a-z0-9]{32}$/i

+25

Depuis quand hexadécimaux vont jusqu'à z? –

Répondre

33

MD5:

/^[0-9a-f]{32}$/i 

SHA-1:

/^[0-9a-f]{40}$/i 

MD5 ou SHA-1:

/^[0-9a-f]{32}(?:[0-9a-f]{8})?$/i 

En outre, la plupart des hachages sont toujours présentés en minuscules hexadécimaux. Vous pouvez donc envisager de supprimer le modificateur i.


Par ailleurs, hexadécimal signifie base 16:

0 1 2 3 4 5 6 7 8 9 A B C D E F = base 16 
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 = base 10 

Comme vous pouvez le voir il ne va de 0 à F, de la même manière décimale (ou base 10) ne passe de 0 à @

+0

Vous venez de me sauver beaucoup de douloureuses recherches google –

13
/^[a-f0-9]{32}$/i 

devrait fonctionner un peu mieux, puisque sont généralement hachages MD5 exprimé en nombres hexadécimaux.

-1

@OP, vous pouvez utiliser /[a-f0-9]{32,40}/, cela peut vérifier la longueur supérieure à 32, tels que ceux générés à partir de sha1.

9

Il y a aussi la classe de caractères POSIX xdigit (voir perlreref):

/^[[:xdigit:]]{32}$/ 
5

Eh bien, un point important à considérer est le fait que $ peut correspondre \n. Par conséquent:

E:\> perl -e "$x = qq{1\n}; print qq{OK\n} if $x =~ /^1$/" 
OK

Ooops!

Le modèle correct est donc:

/^[[:xdigit:]]{32}\z/ 
0

encore plus facile et plus rapide que RegEx tel que recommandé par PHP Ctype Functions:

function is_md5($s){ return (ctype_xdigit($s) and strlen($s)==32); } 
Questions connexes