Decoding URL parameters with JavaScript
这应该是一个简单的任务,但是我似乎找不到解决方案。
我有一个基本字符串,它是通过查询字符串参数传递的,例如:
我已经尝试过
是的,decodeURIComponent函数不会将+转换为空格,这是事实。因此,您必须使用替换功能替换+。
理想情况下,以下解决方案有效。
1 2 | var str_name = 'This+is+a+message+with+spaces'; decodeURIComponent((str_name + '').replace(/\+/g, '%20')); |
就像已经指出的那样,
-
decodeURI 旨在用于整个URI,即它不解码? ,& ,= ,+ 等分隔符。 -
用于解码参数
decodeURIComponent
(值得一看:decodeURIComponent和decodeURI有什么区别?) -
您尝试解码的字符串可能实际上包含编码为
%2B 的+ ,因此在转换后您不应替换+ ,因为您可能会丢失实际上想要的+ 符号,例如something?num=%2B632+905+123+4567 应变为:
something?num=+632 905 123 4567
因为您可能要提取数字:+632 905 123 4567
因此,正确的方法是:
1 2 | var str = 'something?num=%2B632+905+123+4567'; decodeURIComponent( str.replace(/\+/g, '%20') ); |
加号未编码/解码。要查看解码功能正常工作,您需要首先传递编码的URI。看一看:
1 | encodeURI("http://www.foo.com/bar?foo=foo bar jar" ) |
将生成:
1 | decodeURI("http://www.foo.com/bar?foo=foo%20bar%20jar" ) |
将生成:
下面的代码将解码,并以对象形式为您提供参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | export function getParamsFromUrl(url) { url = decodeURI(url); if (typeof url === 'string') { let params = url.split('?'); let eachParamsArr = params[1].split('&'); let obj = {}; if (eachParamsArr && eachParamsArr.length) { eachParamsArr.map(param => { let keyValuePair = param.split('=') let key = keyValuePair[0]; let value = keyValuePair[1]; obj[key] = value; }) } return obj; } } |
我创建了自己的字符串方法来支持所需的编码/解码。这些方法将正确处理+编码和解码,使您的字符串中具有加号(+),并且原始空格仍被编码为+。
1 2 3 4 5 6 7 | String.prototype.plusEncode = function() { return encodeURIComponent(this).replace(/\%20/gm,"+"); } String.prototype.plusDecode = function() { return decodeURIComponent(this.replace(/\+/gm,"%20")); } |