2010-02-18 29 views
9

Lập trình gần đây trong PHP, tôi nghĩ rằng tôi đã có một biểu thức Perl thường xuyên làm việc nhưng khi tôi kiểm tra nó dựa trên những gì tôi muốn, nó không hoạt động.Biểu thức chính quy Perl để khớp với mã băm MD5?

Biểu thức đúng để kiểm tra xem có điều gì đó là MD5 không (32 chữ số thập lục phân của a-z và 0-9).

Hiện nay, tôi có /^[a-z0-9]{32}$/i

+25

Từ khi nào hexadecimals đi lên đến z? –

Trả lời

33

MD5:

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

SHA-1:

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

MD5 hoặc SHA-1:

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

Ngoài ra, hầu hết các băm luôn được trình bày theo cách hệ thập lục phân chữ thường, vì vậy bạn có thể muốn xem xét việc giảm công cụ sửa đổi i.


Bằng cách này, hệ thập lục phân có nghĩa là cơ sở 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 

Như bạn có thể nhìn thấy nó chỉ đi từ 0 đến F, các số thập phân tương tự cách (hoặc cơ sở 10) chỉ đi từ 0 đến 9.

+0

Bạn vừa lưu cho tôi nhiều tìm kiếm google đau đớn –

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

nên làm việc tốt hơn một chút, vì MD5 băm thường được thể hiện dưới dạng số thập lục phân.

-1

@OP, bạn có thể muốn sử dụng /[a-f0-9]{32,40}/, điều này có thể kiểm tra độ dài lớn hơn 32, chẳng hạn như những người được tạo từ sha1.

9

Ngoài ra còn có tính chất giai cấp POSIX xdigit (xem perlreref):

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

Vâng, một điểm quan trọng cần xem xét là một thực tế rằng $ thể phù hợp \n. Do đó:

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

Rất tiếc!

Các mô hình chính xác, do đó, là:

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

Thậm chí dễ dàng hơn và nhanh hơn so với RegEx theo khuyến cáo của PHP Ctype Functions:

function is_md5($s){ return (ctype_xdigit($s) and strlen($s)==32); } 
Các vấn đề liên quan