Perl正则表达式匹配MD5哈希值?
问题描述:
最近在PHP中编程,我以为我有一个正常工作的Perl正则表达式,但是当我检查它对我想要的,它不起作用。Perl正则表达式匹配MD5哈希值?
什么是正确的表达式来检查是否有某物是MD5(32位十六进制的a-z和0-9)。
目前,我有/^[a-z0-9]{32}$/i
答
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.
+0
你刚刚为我节省了很多痛苦的谷歌搜索 – 2010-05-27 00:20:09
答
/^[a-f0-9]{32}$/i
应工作好一点,因为MD5哈希值通常表示为十六进制数。
答
@OP,您可能想要使用/[a-f0-9]{32,40}/
,这可以检查长度大于32,如从sha1生成的那些。
答
好了,要考虑的重要一点是,$
可以匹配\n
。因此:
E:\> perl -e "$x = qq{1\n}; print qq{OK\n} if $x =~ /^1$/" OK
哎呀!
正确的模式,因此,是:所推荐的PHP Ctype Functions
/^[[:xdigit:]]{32}\z/
答
更方便,更比正则表达式快:
function is_md5($s){ return (ctype_xdigit($s) and strlen($s)==32); }
由于没有十六进制数时上升到z? – 2010-02-18 02:01:16