簡體   English   中英

Perl正則表達式匹配MD5哈希?

[英]Perl Regular Expressions to match a MD5 Hash?

最近用PHP編程,我以為我有一個有效的Perl正則表達式但是當我按照我想要的方式檢查它時,它沒有用。

什么是正確的表達式來檢查某個東西是否是MD5(32位十六進制的az和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。

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

應該工作得更好,因為MD5哈希通常表示為十六進制數。

還有POSIX字符類xdigit (參見perlreref ):

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

好吧,需要考慮的重點是$可以匹配\\n 因此:

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

哎呀!

因此,正確的模式是:

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

比PHP Ctype函數推薦的更容易和更快的RegEx:

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

@OP,您可能想要使用/[a-f0-9]{32,40}/ ,這可以檢查大於32的長度,例如從sha1生成的長度。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM