Невозможно правильно декодировать / кодировать URL - PullRequest
0 голосов
/ 06 августа 2020

Я работаю над системой декодирования и кодирования URL. Но по какой-то странной причине он будет декодировать / кодировать только определенную строку. Кроме того, кажется, что он декодирует / кодирует строку, когда в ней есть определенный фрагмент. Это довольно сложно объяснить, но это довольно непонятно, что это может не сработать. Я попытался выяснить, в чем проблема, но из-за этого вся проблема кажется скорее нелогичной, чем логичной.

Надеюсь, кто-нибудь сможет мне с этим помочь. С объяснением этому. Я бы хотел, чтобы код был в том же стиле. Так я могу попрактиковаться JS больше.

// I know I don't have all the characters markek. I am doing that later
var Url = {
  filterEncode : ["%2B","%3A","%3D","%3F","%2F","%26","%252F","%253A","%253D","%253F","%252B"],
  filterDecode : ["+",":","=","?","/","&","%2F","%3A","%3D","%3F","%2B"],
  decode : function(decodeText){
    let returnString, a, b;
    let filterEncode = Url.filterEncode;
    let filterDecode = Url.filterDecode;
    for (a = 0; a < filterEncode.length; a++){
      let regexEn = new RegExp(filterEncode[a],"g");
      let regexDe = new RegExp("/" + filterDecode[a],"g");
      let regex = new RegExp(regexEn,"g");
      let array = (decodeText.match(regex) || []).length
      for (b = 0; b < array; b++){
        returnString = decodeText.replace(filterEncode[a],filterDecode[a]);
        decodeText = returnString;
      }
    }
    return returnString;
  },
  encode : function(encodeText){
    let returnString, a, b;
    let filterEncode = Url.filterEncode;
    let filterDecode = Url.filterDecode;
    for (a = 0; a < filterEncode.length; a++){
      let regexEn = new RegExp("[" + filterEncode[2] + "]","g");
      let regexDe = new RegExp("[" + filterDecode[2] + "]","g");
      let regex = new RegExp(regexEn,"g");
      let array = (encodeText.match(regex) || []).length;
      for (b = 0; b < array; b++){
        returnString = encodeText.replace(filterDecode[a],filterEncode[a]);
        encodeText = returnString;
      }
    }
    return returnString;
  }
}

// Saying it is undefined
console.log(Url.encode("="));

// Encodes it just find
console.log(Url.encode("%3F"));

// Encodes both of them but for some odd reason encodes the
// equal sign twice.
console.log(Url.encode("%3F ="));

Я действительно надеюсь, что все кажется ясным относительно того, в чем моя проблема. Обычно я просто пытаюсь найти здесь ответ, но эта проблема настолько запутана, что я не знаю, что именно искать.

Спасибо!

1 Ответ

2 голосов
/ 06 августа 2020

Некоторые из ваших строк в filterDecode имеют особое значение как регулярные выражения. При преобразовании строки в регулярное выражение вам нужно обернуть каждый символ в [], чтобы он соответствовал буквально.

Вам не нужно объединять / при создании regexDe.

Петли for(b...) не нужны. Используйте регулярное выражение в вызове replace(), и он выполнит все замены сразу, поскольку у него есть флаг g.

Поместите строки кодирования, содержащие %, в начало массива. . В противном случае, когда вы кодируете что-то вроде = как %3D, более поздняя итерация внешнего l oop перекодирует это как %253D. Вы хотите кодировать это только в том случае, если это было в исходной строке, а не на промежуточном этапе.

var Url = {
  filterDecode: ["%252F", "%253A", "%253D", "%253F", "%252B", "%2B", "%3A", "%3D", "%3F", "%2F", "%26"],
  filterEncode: ["%2F", "%3A", "%3D", "%3F", "%2B", "+", ":", "=", "?", "/", "&"],
  strToRe: function(str) {
    let reStr = str.split("").map(c => '[' + c + ']').join('');
    return new RegExp(reStr, "g");
  },
  decode: function(decodeText) {
    let a;
    let filterEncode = Url.filterEncode;
    let filterDecode = Url.filterDecode;
    for (a = 0; a < filterDecode.length; a++) {
      decodeText = decodeText.replace(Url.strToRe(filterDecode[a]), filterEncode[a]);
    }
    return decodeText;
  },
  encode: function(encodeText) {
    let a, b;
    let filterEncode = Url.filterEncode;
    let filterDecode = Url.filterDecode;
    for (a = 0; a < filterEncode.length; a++) {
      encodeText = encodeText.replace(Url.strToRe(filterEncode[a]), filterDecode[a]);
    }
    return encodeText;
  }
}

console.log(Url.encode("="));
console.log(Url.decode("%3D"));
console.log(Url.encode("%3F"));
console.log(Url.decode("%253F"));
console.log(Url.encode("%3F ="));
console.log(Url.decode("%253F %3D"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...