Perl正则表达式匹配MD5哈希?

时间:2010-02-18 01:54:10

标签: php regex perl validation md5

最近用PHP编程,我以为我有一个有效的Perl正则表达式,但是当我按照我想要的方式检查它时,它没有用。

检查某个东西是否为MD5的正确表达式是什么(a-z的32位十六进制和0-9)。

目前,我有/^[a-z0-9]{32}$/i

6 个答案:

答案 0 :(得分:33)

<强> MD5:

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

<强> SHA-1:

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

MD5 SHA-1:

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

此外,大多数哈希值始终以小写十六进制方式显示,因此您可能需要考虑删除i修饰符。


顺便说一句,十六进制表示基数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

因为你可以看到它只从0到F,十进制(或基数10)只有从0到9的相同方式。

答案 1 :(得分:13)

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

应该工作得更好,因为MD5哈希通常表示为十六进制数。

答案 2 :(得分:9)

还有POSIX角色类xdigit(参见perlreref):

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

答案 3 :(得分:5)

嗯,需要考虑的重点是$可以匹配\n。因此:

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

哎呀!

因此,正确的模式是:

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

答案 4 :(得分:0)

按照PHP Ctype Functions的建议,比RegEx更容易,更快:

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

答案 5 :(得分:-1)

@OP,您可能希望使用/[a-f0-9]{32,40}/,这可以检查大于32的长度,例如从sha1生成的长度。