URI解码时删除百分号

时间:2020-06-19 19:18:28

标签: perl urlencode html-escape-characters

我正在尝试在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 个答案:

答案 0 :(得分:3)

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

这成功将%25admin转换为%admin,这实际上是您想要的结果。但是出于某种未知的原因,您然后可以使用空模式进行另一种替代:

$value =~ s///g;

此空模式具有特殊含义。来自perldoc perlop

空模式//
如果PATTERN的值为空字符串,则使用最后一个成功匹配的正则表达式。

最后一个成功匹配的正则表达式在上面的行中,因此此语句的意思是:

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

这与%admin匹配并得到min