JavaScript解析urlencoded查询参数

时间:2015-08-21 01:53:23

标签: javascript

我在JavaScript中解析URL编码的查询字符串参数时遇到了一个奇怪的问题。

function getUrlVars() {

    var vars = [], hash;
    alert(window.location.href);
    var hashes = window.location.href.slice(decodeURIComponent(window.location.href).indexOf('?') + 1).split('&');
    alert(decodeURIComponent(window.location.href));
    for (var i = 0; i < hashes.length; i++) {
        hash = hashes[i].split('=');
        vars.push(hash[0]);
        vars[hash[0]] = hash[1];
    }
    return vars;
}

网址:here

"DZj9aEoyZ2I="是base64 URL编码值,但它无法正确解析;它忽略了"%3d"。请建议一个解决方案?

3 个答案:

答案 0 :(得分:0)

仅在解压缩后对值进行解码;

function getUrlVars() {

    var vars = {}, hash; url = 'http://domain/approveFile/ApproveFile.aspx?id=DZj9aEoyZ2I%3d';
    var hashes = url.slice(url.indexOf('?') + 1).split('&');
    for (var i = 0; i < hashes.length; i++) {
        hash = hashes[i].split('=');
        vars[hash[0]] = decodeURIComponent(hash[1]);
    }
    return vars;
}

这会为您提供Object {id: "DZj9aEoyZ2I="}

答案 1 :(得分:0)

您在分割=之前解码部分,这意味着%3d被视为键值分隔符,最终以{{1}结尾在循环内部。这似乎是不受欢迎的行为,因此在所有hash[2]之后修复为decodeURIComponent

尝试实施.split作为列表功能,类似于您在 php 中找到的内容,为繁荣发布..

foo[]

网址上使用搜索function getUrlVars() { var $_GET = Object.create(null), // for..in safe pairs = window.location.search.slice(1).split('&'), pair, i; for (i = 0; i < pairs.length; ++i) { pair = pairs[i].split('='); if (pair[0].slice(-2) === '[]') { pair[0] = pair[0].slice(0, -2); pair[0] = decodeURIComponent(pair[0]); if (pair[1]) pair[1] = decodeURIComponent(pair[1]); // don't assume this if (!(pair[0] in $_GET)) $_GET[pair[0]] = []; else if (!Array.isArray($_GET[pair[0]])) $_GET[pair[0]] = [$_GET[pair[0]]]; $_GET[pair[0]].push(pair[1]); } else { pair[0] = decodeURIComponent(pair[0]); if (pair[1]) pair[1] = decodeURIComponent(pair[1]); // don't assume this $_GET[pair[0]] = pair[1]; } } return $_GET; } 将提供

?foo=bar%3d&baz[]=fizz&baz[]=buzz

答案 2 :(得分:0)

如今,如果您使用的是ES6:

const getUrlParams = (search) => {
    let hashes = search.slice(search.indexOf('?') + 1).split('&')
    let params = {}
    hashes.map(hash => {
        let [key, val] = hash.split('=')
        params[key] = decodeURIComponent(val)
    })

    return params
}

console.log(getUrlParams(window.location.search))