Psy*_*nic 21 php testing url-encoding
如何测试字符串是否为URL编码?
以下哪种方法更好?
function is_urlEncoded($string){
$test_string = $string;
while(urldecode($test_string) != $test_string){
$test_string = urldecode($test_string);
}
return (urlencode($test_string) == $string)?True:False;
}
$t = "Hello World > how are you?";
if(is_urlEncoded($sreq)){
print "Was Encoded.\n";
}else{
print "Not Encoded.\n";
print "Should be ".urlencode($sreq)."\n";
}
Run Code Online (Sandbox Code Playgroud)
上面的代码可以工作,但不是在字符串经过双重编码的情况下,如下例所示:
$t = "Hello%2BWorld%2B%253E%2Bhow%2Bare%2Byou%253F";$t = "Hello+World%2B%253E%2Bhow%2Bare%2Byou%253F";小智 35
我有一招:
你可以这样做,以防止双重编码.每次首先解码然后再次编码;
$string = urldecode($string);
Run Code Online (Sandbox Code Playgroud)
然后再做一次
$string = urlencode($string);
Run Code Online (Sandbox Code Playgroud)
执行这种方式我们可以避免双重编码:)
AMB*_*AMB 12
这是我刚刚放在一起的东西.
if ( urlencode(urldecode($data)) === $data){
echo 'string urlencoded';
} else {
echo 'string is NOT urlencoded';
}
Run Code Online (Sandbox Code Playgroud)
jhe*_*ngs 10
你永远不会确定字符串是否是URL编码的,或者它是否应该包含序列%2B.相反,它可能取决于字符串的来源,即它是手工制作还是来自某些应用程序.
在字符串中搜索要编码的字符是否更好,哪些字符不存在,如果存在则不编码.
我认为这是一种更好的方法,因为它会处理以编程方式完成的事情(假设应用程序不会留下非编码字符).
这里有一件事会令人困惑......从技术上讲,%如果它将出现在最终值中,那么"应该"编码,因为它是一个特殊字符.您可能必须结合使用方法来查找应编码的字符,以及验证字符串是否成功解码(如果没有找到).
好吧,术语“url 编码”有点模糊,也许简单的正则表达式检查就可以解决问题
$is_encoded = preg_match('~%[0-9A-F]{2}~i', $string);
Run Code Online (Sandbox Code Playgroud)
我认为没有万无一失的方法可以做到这一点.例如,请考虑以下事项:
$t = "A+B";
Run Code Online (Sandbox Code Playgroud)
这是一个编码为"A B"的URL还是需要编码为"A%2BB"?
小智 5
关于什么:
if (urldecode(trim($url)) == trim($url)) { $url_form = 'decoded'; }
else { $url_form = 'encoded'; }
Run Code Online (Sandbox Code Playgroud)
不能使用双重编码,但无论如何我认为这超出了范围?