Decoding URL parameters with JavaScript

后端 未结 5 700
离开以前
离开以前 2020-11-27 19:22

This should be a simple task, but I can\'t seem to find a solution.

I have a basic string that is being passed through as a query string parameter like this one:

相关标签:
5条回答
  • 2020-11-27 19:48

    I created my own string methods to support the needed encoding/decoding. These methods will handle the + encoding and decoding properly, allowing you to have plusses (+) in your string and still have the original spaces be encoded as +'s.

    String.prototype.plusEncode = function() {
        return encodeURIComponent(this).replace(/\%20/gm,"+");
    }
    
    String.prototype.plusDecode = function() {
        return decodeURIComponent(this.replace(/\+/gm,"%20"));
    }
    
    0 讨论(0)
  • 2020-11-27 19:58

    The plus sign is not encoded/decoded. To see the decode function working, you need to pass a encoded URI first. Take a look:

    encodeURI( "http://www.foo.com/bar?foo=foo bar jar" )
    

    Will generate: http://www.foo.com/bar?foo=foo%20bar%20jar, i.e., the encoded URI.

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

    Will generate: http://www.foo.com/bar?foo=foo bar jar, i.e., the decoded URI.

    0 讨论(0)
  • 2020-11-27 19:59
    Like it was pointed out already, decodeURI function doesn't convert + to space, but there are some things worth to realize here:
    • decodeURI is meant to be used for whole URI, i.e. it doesn't decode separators like ?, &, =, +, etc.
    • for decoding parameters decodeURIComponent should be used
      (worth to have a look at: What is the difference between decodeURIComponent and decodeURI? )
    • string that you are trying to decode might actually contain + encoded as %2B, thus you should not replace + after the conversion since you might lost + signs that you actually want there, e.g. something?num=%2B632+905+123+4567 should become:
      something?num=+632 905 123 4567
      since you are probably going to extract the number: +632 905 123 4567

    So the correct way to do this is:

    var str = 'something?num=%2B632+905+123+4567';
    decodeURIComponent( str.replace(/\+/g, '%20') );
    
    0 讨论(0)
  • 2020-11-27 20:04

    Yes it is true that decodeURIComponent function doesn't convert + to space. So you have to replace the + using replace function.

    Ideally the below solution works.

    var str_name = 'This+is+a+message+with+spaces';
    decodeURIComponent((str_name + '').replace(/\+/g, '%20'));
    
    0 讨论(0)
  • 2020-11-27 20:11

    The below code will decode and gives you the params in form of objects

    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;
        }
    }
    
    0 讨论(0)
提交回复
热议问题