26

文字列が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";
}

上記のコードは機能しますが、次の例のように、文字列が二重にエンコードされている場合は機能しません。

  • $t = "Hello%2BWorld%2B%253E%2Bhow%2Bare%2Byou%253F";
  • $t = "Hello+World%2B%253E%2Bhow%2Bare%2Byou%253F";
4

13 に答える 13

39

私には1つのトリックがあります:

これを行うと、二重エンコードを防ぐことができます。最初にデコードしてから再度エンコードするたび。

$string = urldecode($string);

その後、もう一度やり直してください

$string = urlencode($string);

このように実行すると、二重エンコードを回避できます:)

于 2010-06-17T08:28:13.500 に答える
19

これが私がまとめたものです。

if ( urlencode(urldecode($data)) === $data){
    echo 'string urlencoded';
} else {
    echo 'string is NOT urlencoded';
}
于 2014-01-18T15:34:37.960 に答える
10

文字列がURLエンコードされているのか、それともシーケンスが含まれているはずなのかはわかりません%2B。代わりに、それはおそらく文字列がどこから来たのか、つまりそれが手作りであるか、何らかのアプリケーションからのものであるかによって異なります。

文字列を検索して、エンコードされる文字とエンコードされない文字を検索する方がよいでしょうか。存在する場合は、エンコードされません。

プログラムで行われたことを処理するので、これはより良いアプローチだと思います(アプリケーションがエンコードされていない文字を残さなかったと仮定します)。

ここで混乱することが1つあります...技術的%には、特殊文字であるため、最終値に存在する場合は「エンコードする必要があります」。アプローチを組み合わせて、エンコードする必要のある文字を探し、文字列が見つからない場合は文字列が正常にデコードされることを検証する必要がある場合があります。

于 2009-10-28T14:58:12.790 に答える
5

私はそれを行うための絶対確実な方法はないと思います。たとえば、次のことを考慮してください。

$t = "A+B";

それは「AB」でエンコードされたURLですか、それとも「A%2BB」にエンコードする必要がありますか?

于 2009-10-28T14:56:28.023 に答える
5

「URLエンコード」という用語は少し曖昧です。おそらく単純な正規表現チェックでうまくいくでしょう。

$is_encoded = preg_match('~%[0-9A-F]{2}~i', $string);
于 2009-10-28T14:57:00.440 に答える
5

どうですか:

if (urldecode(trim($url)) == trim($url)) { $url_form = 'decoded'; }
  else { $url_form = 'encoded'; }

ダブルエンコーディングでは動作しませんが、とにかくこれは範囲外だと思いますか?

于 2011-11-11T22:21:18.427 に答える
3

エンコードプロセスを通じて同じままである文字列があるため、これを行うための信頼できる方法はありません。つまり、「abc」がエンコードされているかどうか。明確な答えはありません。また、あなたが遭遇したように、いくつかの文字は複数のエンコーディングを持っています...しかし...

一部の文字が複数の方法でエンコードされている可能性があるため、decode-check-encode-checkスキームは失敗します。ただし、関数へのわずかな変更はかなり信頼できるはずです。デコードによって文字列が変更されるかどうかを確認してください。変更される場合は、エンコードされています。

もちろん、「10 + 20 = 30」はtrueを返す(+はスペースに変換される)ため、絶対確実ではありませんが、実際には算術演算を行っています。これがあなたの計画が対抗しようとしていることだと思います。申し訳ありませんが、完璧な解決策はないと思います。

HTH。

編集:
私自身のコメントで述べたように(わかりやすくするためにここで繰り返します)、おそらくURLに無効な文字(スペースなど)がないかどうかを確認し、エンコードされていない文字がある場合はそれをチェックすることをお勧めします。存在しない場合は、デコードして文字列が変更されるかどうかを確認してください。これはまだ上記の算術を処理しません(これは不可能です)が、うまくいけば十分でしょう。

于 2009-10-28T14:57:43.483 に答える
3

@ user187291コードは機能し、+がエンコードされていない場合にのみ失敗します。

私はこれが非常に古い投稿であることを知っています。しかし、これは私にはうまくいきました。

$is_encoded = preg_match('~%[0-9A-F]{2}~i', $string);
if($is_encoded) {
 $string  = urlencode(urldecode(str_replace(['+','='], ['%2B','%3D'], $string)));
} else {
  $string = urlencode($string);
}
于 2015-01-07T13:15:27.230 に答える
1

すでにURLからデータを取得している場合は、デコードにフラグを立てる変数を送信します。

?path=folder/new%20file.txt&decode=1
于 2011-04-03T00:12:27.357 に答える
1

私の場合、完全なURLがエンコードされているかどうかを確認したかったので、URLに文字列が含まれている必要があることはすでにわかっていましたhttps://。文字列にエンコードされたバージョンが含まれているかどうかを確認https://しました(https%3A%2F%2F)。 t、それから私はそれがエンコードされていないことを知っていました:

//make sure $completeUrl is encoded
if (strpos($completeUrl, urlencode('https://')) === false) {
    // not encoded, need to encode it
    $completeUrl = urlencode($completeUrl);
}

https://理論的には、このソリューションは、文字列の一部(この例では)がチェックしようとしているものに常に存在することがわかっている限り、エンコードされる文字を含む任意の文字列で使用できます。

于 2020-06-26T10:22:59.090 に答える
0

次のテストを使用して、文字列がurlencodedされているかどうかを確認しています。

if(urlencode($str) != str_replace(['%','+'], ['%25','%2B'], $str))

文字列がすでにurlencodedされている場合、二重エンコードによって変更される文字は、%(エンコードされたすべての文字列を開始する)と+(スペースを置き換える)のみです。これらを元に戻すと、元の文字列が作成されます。

これがあなたのために働くかどうか私に知らせてください。

于 2014-03-18T16:03:05.900 に答える
0

見つけました。
URLは例の場合:https
://example.com/xD?foo = bar&uri = https%3A%2F%2Fexample.com%2FxD 必要なのは$ _GET['uri']がエンコードされているかどうかです。

preg_match("/.*uri=(.*)&?.*/", $_SERVER['REQUEST_URI'], $r);
if (isset($_GET['uri']) && urldecode($r['1']) === $r['1']) {
  // Code Here if url is not encoded
}
于 2019-08-27T16:15:53.660 に答える
-1

private static boolean isEncodedText(String val、String ... encoding)throws UnsupportedEncodingException {String decodeText = URLDecoder.decode(val、TransformFetchConstants.DEFAULT_CHARSET);

    if(encoding != null && encoding.length > 0){
        decodedText = URLDecoder.decode(val, encoding[0]);
    }

    String encodedText =  URLEncoder.encode(decodedText);

    return encodedText.equalsIgnoreCase(val) || !decodedText.equalsIgnoreCase(val);

}
于 2015-05-24T17:30:06.347 に答える