2010-02-18 29 views
9

Programando recientemente en PHP, pensé que tenía una expresión regular de Perl que funcionaba pero cuando lo comprobé contra lo que quería, no funcionó.Perl expresiones regulares para que coincida con un hash MD5?

¿Cuál es la expresión correcta para comprobar si algo tiene un MD5 (32 dígitos hexadecimales de a-z y 0-9).

Actualmente, tengo /^[a-z0-9]{32}$/i

+25

Desde cuándo hexadecimales van hasta z? –

Respuesta

33

MD5:

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

SHA-1:

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

MD5 o SHA-1:

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

Además, la mayoría de los hashes siempre se presentan en minúsculas hexadecimales, por lo que puede considerar descartar el modificador i.


Por cierto, hexadecimal significa 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 

Así como se puede ver que sólo va de 0 a F, el mismo decimal manera (o base 10) solamente va de 0 a 9.

+0

Acabas de guardarme muchas dolorosas búsquedas de Google –

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

debería funcionar un poco mejor, ya que por lo general MD5 hash se expresa en números hexadecimales.

-1

@OP, es posible que desee utilizar /[a-f0-9]{32,40}/, esto puede comprobar la longitud superior a 32, como las generadas a partir de sha1.

9

También existe la clase de caracteres POSIX xdigit (ver perlreref):

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

Bueno, un punto importante a considerar es el hecho de que puede coincidir con $\n. Por lo tanto:

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

Ooops!

El patrón correcto, por lo tanto, es:

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

Incluso más fácil y más rápido que RegEx según lo recomendado por PHP Ctype Functions:

function is_md5($s){ return (ctype_xdigit($s) and strlen($s)==32); } 
Cuestiones relacionadas