关于html:使用JavaScript解码URL参数

Decoding URL parameters with JavaScript

这应该是一个简单的任务,但是我似乎找不到解决方案。

我有一个基本字符串,它是通过查询字符串参数传递的,例如:This+is+a+message+with+spaces。 我想使用JavaScript将参数解码为This is a message with spaces,但似乎无法解码。

我已经尝试过decodeURI('This+is+a+message+with+spaces'),但是结果仍然包含+符号。


是的,decodeURIComponent函数不会将+转换为空格,这是事实。因此,您必须使用替换功能替换+。

理想情况下,以下解决方案有效。

1
2
var str_name = 'This+is+a+message+with+spaces';
decodeURIComponent((str_name + '').replace(/\+/g, '%20'));


就像已经指出的那样,decodeURI函数不会将+转换为空格,但是这里有些事情值得实现:

  • 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" )

将生成:http://www.foo.com/bar?foo=foo%20bar%20jar,即编码的URI。

1
decodeURI("http://www.foo.com/bar?foo=foo%20bar%20jar" )

将生成:http://www.foo.com/bar?foo=foo bar jar,即解码后的URI。


下面的代码将解码,并以对象形式为您提供参数

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"));
}