测试字符串是否在PHP中进行URL编码

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)

执行这种方式我们可以避免双重编码:)

  • 那是错的!曾经解码过的URL不能以相同的方式编码.有关详细信息,请访问:http://blog.lunatech.com/2009/02/03/what-every-web-developer-must-know-about-url-encoding例如"a + b"作为路径参数有效.然后,如果你解码它你有相同的字符串(a + b),然后编码结果是"a%2Bb"! (2认同)

AMB*_*AMB 12

这是我刚刚放在一起的东西.

if ( urlencode(urldecode($data)) === $data){
    echo 'string urlencoded';
} else {
    echo 'string is NOT urlencoded';
}
Run Code Online (Sandbox Code Playgroud)

  • @suther请使用各种输入对其进行测试,我不记得了,但有时它无法按预期工作。 (2认同)

jhe*_*ngs 10

你永远不会确定字符串是否是URL编码的,或者它是否应该包含序列%2B.相反,它可能取决于字符串的来源,即它是手工制作还是来自某些应用程序.

在字符串中搜索要编码的字符是否更好,哪些字符不存在,如果存在则不编码.

我认为这是一种更好的方法,因为它会处理以编程方式完成的事情(假设应用程序不会留下非编码字符).

这里有一件事会令人困惑......从技术上讲,%如果它将出现在最终值中,那么"应该"编码,因为它是一个特殊字符.您可能必须结合使用方法来查找应编码的字符,以及验证字符串是否成功解码(如果没有找到).


use*_*291 6

好吧,术语“url 编码”有点模糊,也许简单的正则表达式检查就可以解决问题

$is_encoded = preg_match('~%[0-9A-F]{2}~i', $string);
Run Code Online (Sandbox Code Playgroud)

  • 嗯,我认为“+”是 url 中空格的有效编码? (2认同)

Kai*_*aja 5

我认为没有万无一失的方法可以做到这一点.例如,请考虑以下事项:

$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)

不能使用双重编码,但无论如何我认为这超出了范围?