Знак процента удаляется при декодировании URI - PullRequest
1 голос
/ 19 июня 2020

Я пытаюсь декодировать uriencoded бит данных формы в Perl (закодированные данные - %25admin, который должен декодировать в %admin). Я использую для этого несколько повторяющихся простых регулярных выражений:

    $value =~ tr/+/ /;
    $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;    
    $value =~ s///g;

Этот набор регулярных выражений хорошо служил мне годами и обычно работает нормально, но в этом случае он выводит min ("% ad" отсутствует в декодированной строке, как если бы оно было частью экранированного символа). Что мне не хватает, что он заставляет его интерпретировать символы %25ad как одиночный экранированный символ, а не %25 как экранированный символ и ad как независимый от него?

1 Ответ

3 голосов
/ 20 июня 2020
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;    

Это успешно преобразует %25admin в %admin, что на самом деле является желаемым результатом. Но по какой-то неизвестной причине вы затем выполняете другую замену с пустым шаблоном:

$value =~ s///g;

Этот пустой шаблон имеет особое значение. From perldo c perlop :

Пустой шаблон //
Если ШАБЛОН оценивается как пустая строка, последний успешно совпавший обычный вместо этого используется выражение.

Последнее успешно сопоставленное регулярное выражение находится в строке выше, поэтому этот оператор по существу означает:

$value =~ s/%([a-fA-F0-9][a-fA-F0-9])//g;

Это соответствует %admin и приводит к min.

...