URI 解码时删除百分号
Percentage sign getting removed when URI decoding
我正在尝试用 Perl 解码 uri 编码的表单数据位(编码数据是 %25admin
, 应该 解码为 %admin
)。我正在使用一些重复的、简单的正则表达式来做到这一点:
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex())/eg;
$value =~ s///g;
这组正则表达式多年来一直为我服务,通常效果很好,但在这种情况下,它正在输出 min
(解码字符串中缺少“%ad”,就好像它是一部分转义字符)。我错过了什么导致它将字符 %25ad
解释为单个转义字符而不是 %25
作为转义字符和 ad
独立于它?
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex())/eg;
这成功地将 %25admin
转换为 %admin
这实际上是您想要的结果。但是出于某种未知原因,您随后用空模式进行了另一个替换:
$value =~ s///g;
这个空图案有特殊的意义。来自 perldoc perlop:
The empty pattern //
If the PATTERN evaluates to the empty string, the last successfully matched regular expression is used instead.
最后成功匹配的正则表达式在上面一行,所以这条语句的本质意思是:
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])//g;
这匹配 %admin
并导致 min
。
我正在尝试用 Perl 解码 uri 编码的表单数据位(编码数据是 %25admin
, 应该 解码为 %admin
)。我正在使用一些重复的、简单的正则表达式来做到这一点:
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex())/eg;
$value =~ s///g;
这组正则表达式多年来一直为我服务,通常效果很好,但在这种情况下,它正在输出 min
(解码字符串中缺少“%ad”,就好像它是一部分转义字符)。我错过了什么导致它将字符 %25ad
解释为单个转义字符而不是 %25
作为转义字符和 ad
独立于它?
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex())/eg;
这成功地将 %25admin
转换为 %admin
这实际上是您想要的结果。但是出于某种未知原因,您随后用空模式进行了另一个替换:
$value =~ s///g;
这个空图案有特殊的意义。来自 perldoc perlop:
The empty pattern //
If the PATTERN evaluates to the empty string, the last successfully matched regular expression is used instead.
最后成功匹配的正则表达式在上面一行,所以这条语句的本质意思是:
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])//g;
这匹配 %admin
并导致 min
。