web-dev-qa-db-ja.com

URLがデコード/エンコードされているかどうかを知る方法は?

エンコードされたURLをデコードするためにJavaScriptメソッドdecodeURIComponentを使用しています。サーバー間でのリダイレクト中にURLが2回エンコードされることがある、1回だけエンコードされることがあるという問題が発生しています。

メソッドdecodeURIComponentを呼び出した後もURLがエンコードされているかどうかを確認したいと思います。どうやってやるの?どんなポインタも私にとって非常に役に立ちます。

更新-1

メソッドを再帰的に呼び出して、指定されたURLに「%」が含まれているかどうかを確認し、「%」が含まれている場合は、デコードしてメソッドを再度呼び出します。そしてそれを呼び出し元に返さない場合、それは機能しますか?

アップデート-2

私の場合、私は:

_callBackUrl=http%253A%252F%252Fadbc.com%252FPOSM%252Fapp%252Fpages%252Fadf.task-flow%253Fadf.tfDoc%253D%25252FWEB-INF%25252Ftask-flows%25252Fcatalog-edit-task-flow.xml%2526adf.tfId%253Dcatalog%2526_adf.ctrl-state%253Db9akorh22_9%2526articleReference%253D10C00135%2526previousView%253Dcatalog-home%2526fromUCM%253Dtrue%2526articleType%253Dposm%2526developer%253Dcentral
_

次に、jsメソッドでcallBackUrlの値を取得し、それをデコードして、デコードされたURLでwindow.open()を起動します。パラメータは同じであり、次のとおりです。

  • adf.tfDoc
  • adf.tfId
  • 記事参照
  • previousView
  • からUCM
  • articleType
  • 開発者

その中にパラメータ。したがって、_value="%.."_のようなクエリ文字列はありません。

アップデート-3

私は次のメソッドを書きました:

_var decodeURLRecursively = function(url) {
    if(url.indexOf('%') != -1) {
        return decodeURLRecursively(decodeURIComponent(url));
    }

    return url;
}
_
23
Tapas Bose

%の兆候がなくなるまで繰り返しデコードすると、99%以上の時間で動作します。 /%[0-9a-f]{2}/iに一致するものが見つかる限り、繰り返し呼び出すとさらに効果的です。

ただし、(奇妙な理由で)ファイルに100%achievedという名前を付けると、%ac¬にデコードされてデコードが失敗するため、問題が発生します。残念ながら、このケースを検出する方法はありません。

理想的には、何かが複数回エンコードされているかどうかを知る必要があり、最適には、最初にそれが発生しないようにする必要があります。

12

URL文字列がエンコードされているかどうかを知る簡単な方法があります。

最初の文字列を取得し、デコードした結果と比較します。結果が同じ場合、文字列はエンコードされません。結果が異なる場合は、エンコードされます。

私は私のURLでこの問題があり、私はこの関数を使用しました:

function isEncoded(uri) {
  uri = uri || '';

  return uri !== decodeURIComponent(uri);
}

文字列でisEncodedを呼び出し続ける必要があるかどうかを知るために、whileループで(または再帰を使用して)decodeURIComponentを判別式として使用できるようになりました。

function fullyDecodeURI(uri){

  while (isEncoded(uri)){
    uri = decodeURIComponent(uri);
  }

  return uri;
}

これにより、複数回エンコードされたURLをデコードする問題が解決されました。お役に立てれば。

30
rodu

文字列が変更されなくなるまでデコードを続けることができます:

str = "xxxxxxx"
dec_str = decode(str)
while(dec_str != str)
     str = dec_str;
     dec_str = decode(str);
1
Jimmy Huang
function checkEncodeURI(str) {
 return /\%/i.test(str)
}

テスト:

let url1 = "https://quora.com/unanswered/I’m-looking-for-a-Freaks-And-Friends-Fox-Glitter-Face-Hinge-Wallet-for-a-Christmas-gift-I’ve-searched-for-hours-online-but-no-one-seemed-to-have-it-does-anyone-know-where-I-can-find-one"
let url2 = 'https://www.quora.com/unanswered/I%E2%80%99m-looking-for-a-Freaks-And-Friends-Fox-Glitter-Face-Hinge-Wallet-for-a-Christmas-gift-I%E2%80%99ve-searched-for-hours-online-but-no-one-seemed-to-have-it-does-anyone-know-where-I-can-find-one'
let a = checkEncodeURI(url1)
console.log(a)
let b = checkEncodeURI(url2)
console.log(b)
0
Carlos Silva