无法正确解码/编码网址

时间:2020-08-06 00:49:20

标签: javascript regex algorithm url

我正在研究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 个答案:

答案 0 :(得分:2)

filterDecode中的某些字符串作为正则表达式具有特殊含义。将字符串转换为正则表达式时,您需要将每个字符包装在[]中,以便在字面上进行匹配。

创建/时不需要串联regexDe

不需要for(b...)循环。在replace()调用中使用正则表达式,由于它带有g标志,它将立即执行所有替换。

将包含%的编码字符串放在数组的开头。否则,当将类似=的内容编码为%3D时,外部循环的后续迭代会将其重新编码为%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"));