我正在尝试在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
解释为独立字符?
答案 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
。