javascript - 无法正确解码/编码 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 ="));
我确实希望一切都清楚我的问题是关于什么的。我通常会尝试在这里搜索答案,但是这个问题太混乱了,我不知道我到底应该搜索什么。
谢谢!
解决方案
您的某些字符串在filterDecode
正则表达式中具有特殊含义。将字符串转换为正则表达式时,您需要将每个字符包装起来,[]
以便按字面意思进行匹配。
/
创建时不需要连接regexDe
。
不需要for(b...)
循环。在调用中使用正则表达式,replace()
它会立即执行所有替换,因为它有g
标志。
将包含的编码字符串放在%
数组的开头。否则,当您编码类似=
as%3D
的内容时,外部循环的后续迭代将重新编码为 as %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"));
推荐阅读
- javascript - 用户单击 Chrome 扩展中的页面链接后如何检测 URL 是否更改?
- python - 修改后OpenCv不会保存图像
- javascript - RxDb - 从具有特定索引的数组中删除对象
- python - 无法打印全局变量
- node.js - 使用 mongoose 更新 mongodb 中的多条记录
- flutter - Flutter 应用程序中的子小部件问题
- python - 如何将品牌名称列表添加到数据框中,或者如果它没有出现添加“无”?
- laravel - 在 Laravel Nova 中限制访问
- r - R Data.Table按组计数值类型
- postgresql - 在 Kubernetes 中处于待处理状态的松脆数据 pgo 靠背