开发者

Perl Regular Expressions to match a MD5 Hash?

Recently programming in PHP,开发者_开发问答 I thought I had a working Perl regular expression but when I checked it against what I wanted, it didn't work.

What is the right expression to check if something is a MD5 has (32 digit hexadecimal of a-z and 0-9).

Currently, I have /^[a-z0-9]{32}$/i


MD5:

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

SHA-1:

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

MD5 or SHA-1:

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

Also, most hashes are always presented in a lowercase hexadecimal way, so you might wanna consider dropping the i modifier.


By the way, hexadecimal means 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

So as you can see it only goes from 0 to F, the same way decimal (or base 10) only goes from 0 to 9.


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

Should work a bit better, since MD5 hashes usually are expressed as hexadecimal numbers.


There is also the POSIX character class xdigit (see perlreref):

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


Well, an important point to consider is the fact that $ can match \n. Therefore:

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

Ooops!

The correct pattern, therefore, is:

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


Even easier and faster than RegEx as recommended by PHP Ctype Functions :

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


@OP, you might want to use /[a-f0-9]{32,40}/ , this can check for length greater than 32, such as those generated from sha1.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜