2010-02-18 15 views
9

हाल ही में PHP में प्रोग्रामिंग, मैंने सोचा कि मेरे पास पर्ल नियमित अभिव्यक्ति का काम था लेकिन जब मैंने इसे जो चाहता था उसके खिलाफ चेक किया, तो यह काम नहीं किया।एमडी 5 हैश से मेल खाने के लिए पर्ल नियमित अभिव्यक्तियां?

यह देखने के लिए सही अभिव्यक्ति क्या है कि कोई MD5 है (32 अंकों का हेक्साडेसिमल ए-जेड और 0-9)।

वर्तमान में, मैं /^[a-z0-9]{32}$/i

+25

कब से हेक्साडेसिमल z अप करने के लिए चले गए? –

उत्तर

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 से एफ, उसी तरह दशमलव (या आधार 10) केवल 0 से चला जाता है के लिए चला जाता 9.

+0

आपने अभी मुझे कई दर्दनाक Google खोजों को बचाया है –

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

थोड़ा बेहतर काम करना चाहिए, हैश के बाद से MD5 आमतौर पर हेक्साडेसिमल संख्याओं के रूप में व्यक्त कर रहे हैं।

-1

@OP, आप /[a-f0-9]{32,40}/ का उपयोग करना चाह सकते हैं, यह 32 से अधिक लंबाई की जांच कर सकता है, जैसे sha1 से उत्पन्न।

9

वहाँ भी POSIX चरित्र वर्ग xdigit (perlreref देखें):

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

ठीक है, एक महत्वपूर्ण बिंदु पर विचार करने के तथ्य यह है कि $\n से मिलान कर सकते है। इसलिए:

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

ओउप्स!

सही पैटर्न, इसलिए, यह है:

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

भी आसान है और रेगुलर एक्सप्रेशन से की तुलना में तेजी पीएचपी Ctype Functions द्वारा सिफारिश के रूप में:

function is_md5($s){ return (ctype_xdigit($s) and strlen($s)==32); } 
संबंधित मुद्दे