Недавно программируя в PHP, я думал, что у меня было рабочее регулярное выражение Perl, но когда я проверил его по тому, что я хотел, это не работало.
То, что является правильным выражением, чтобы проверить, является ли что-то MD5, имеет (32 цифры, шестнадцатеричные из a-z и 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
Кроме того, большинство хэшей всегда представляются в строчном шестнадцатеричном виде, поэтому вам стоит отказаться от модификатора и
.
Кстати, шестнадцатеричное число означает основание 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 обычно выражаются в виде шестнадцатеричных чисел.
Что ж, важно учитывать тот факт, что $
может соответствовать \ n
. Следовательно:
E:\> perl -e "$x = qq{1\n}; print qq{OK\n} if $x =~ /^1$/" OK
Ой!
Таким образом, правильный шаблон:
/^[[:xdigit:]]{32}\z/
@OP, вы можете использовать / [a-f0-9] {32,40} /
, это может проверить длину больше 32 , например, созданные из sha1.
Существует также класс символов POSIX xdigit
(см. perlreref ):
/^[[:xdigit:]]{32}$/