web-dev-qa-db-fra.com

Décodage des paramètres d'URL avec JavaScript

Cela devrait être une tâche simple, mais je n'arrive pas à trouver de solution.

J'ai une chaîne de base qui est transmise en tant que paramètre de chaîne de requête comme celui-ci: This+is+a+message+with+spaces. Je voudrais décoder ce paramètre en utilisant JavaScript pour This is a message with spaces, Mais je n'arrive pas à le faire décoder.

J'ai essayé decodeURI('This+is+a+message+with+spaces') mais le résultat contient toujours les signes +.

37
user852367

Oui, il est vrai que la fonction decodeURIComponent ne convertit pas + en espace. Vous devez donc remplacer le + à l'aide de la fonction de remplacement.

Idéalement, la solution ci-dessous fonctionne.

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

Le signe plus n'est pas codé/décodé. Pour voir la fonction de décodage fonctionner, vous devez d'abord passer un URI codé. Regarde:

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

Générera: http://www.foo.com/bar?foo=foo%20bar%20jar, c'est-à-dire l'URI codé.

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

Générera: http://www.foo.com/bar?foo=foo bar jar, c'est-à-dire l'URI décodé.

19
davidbuzatto

Le code ci-dessous va décoder et vous donne les paramètres sous forme d'objets

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;
    }
}
4
Varsha Jadhav

J'ai créé mes propres méthodes de chaîne pour prendre en charge l'encodage/décodage nécessaire. Ces méthodes gèreront l'encodage et le décodage + correctement, vous permettant d'avoir des plus (+) dans votre chaîne et d'avoir toujours les espaces d'origine encodés en +.

String.prototype.plusEncode = function() {
    return encodeURIComponent(this).replace(/\%20/gm,"+");
}

String.prototype.plusDecode = function() {
    return decodeURIComponent(this.replace(/\+/gm,"%20"));
}
1
Harvey