2010-02-18 3 views
9

Недавно программирование на PHP, я думал, что у меня есть рабочее регулярное выражение Perl, но когда я проверил его против того, что я хотел, он не сработал.Perl Regular Выражения для соответствия MD5 Hash?

Какое правильное выражение проверяет, есть ли что-то в MD5 (32-разрядное шестнадцатеричное число a-z и 0-9).

В настоящее время у меня есть /^[a-z0-9]{32}$/i

+25

Так когда же шестнадцатиричном идти до г? –

ответ

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 до F, так же десятичного (или основания 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

еще проще и быстрее, чем RegEx в соответствии с рекомендациями PHP Ctype Functions:

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