Perl регулярные выражения для соответствия хешу MD5? - PullRequest
9 голосов
/ 18 февраля 2010

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

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

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

Ответы [ 6 ]

33 голосов
/ 18 февраля 2010

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.

13 голосов
/ 18 февраля 2010
/^[a-f0-9]{32}$/i

Должно работать немного лучше, поскольку хеши MD5 обычно выражаются в шестнадцатеричных числах.

9 голосов
/ 18 февраля 2010

Существует также класс символов POSIX xdigit (см. perlreref ):

/^[[:xdigit:]]{32}$/
5 голосов
/ 18 февраля 2010

Что ж, важно учитывать тот факт, что $ может соответствовать \n. Поэтому:

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

по электронной почте Ой!

Следовательно, правильный шаблон:

/^[[:xdigit:]]{32}\z/
0 голосов
/ 12 февраля 2014

Даже проще и быстрее, чем RegEx, как рекомендовано PHP Функции Ctype :

function is_md5($s){ return (ctype_xdigit($s) and strlen($s)==32); }
0 голосов
/ 18 февраля 2010

@ OP, вы можете использовать /[a-f0-9]{32,40}/, он может проверять длину больше 32, например, сгенерированную из sha1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...