最近用PHP编程,我以为我有一个有效的Perl正则表达式,但是当我按照我想要的方式检查它时,它没有用。
检查某个东西是否为MD5的正确表达式是什么(a-z的32位十六进制和0-9)。
目前,我有/^[a-z0-9]{32}$/i
答案 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生成的长度。