2015-08-21 3 views
1

У меня возникла странная проблема, анализирующая параметр строки с кодировкой URL-кода в JavaScript.JavaScript parsing urlencoded query parameter

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

URL: http://domain/approveFile/ApproveFile.aspx?id=DZj9aEoyZ2I%3d

Значение "DZj9aEoyZ2I=" является URL-кодированное значение base64, но она не будет правильно разобрать; он игнорирует "%3d". Пожалуйста, предложите решение?

+1

Во-первых, используйте 'window.location.search.slice (1)' вместо того, чтобы пытаться разобрать эту часть URL самостоятельно. Во-вторых, вы декодируете детали перед расщеплением на '=', что означает, что '% 3d' обрабатывается как разделитель ключа-значения, заканчивающийся в' hash [2] 'внутри цикла. Наконец, я уверен, что вместо разделения на '' & "' вы должны делиться на '/ & (?! amp;) /' ie '&' s, которые не являются '&' –

+0

(закончились времени для редактирования) На самом деле последний пункт о '&' неверен, он закодирован как '% 26', а не' &foo; ', которые являются объектами _HTML_, извините –

+0

@ PaulS.A правильный URL не должен иметь' & ' закодирован. –

ответ

0

вы декодирование вас деталь перед расщеплением на =, что означает %3d обращаются как ключ-значения сепаратор а, в конечном итоге в hash[2] внутри цикла. Это, как представляется нежелательное поведение, так что исправить это decodeURIComponent ведь .split s


Пробовала реализацию foo[] как функциональность списка аналогична тому, что вы можете найти в PHP, размещение процветания ..

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

Использование на URL с поиска ?foo=bar%3d&baz[]=fizz&baz[]=buzz даст

getUrlVars(); // {"foo": "bar=", "baz": ["fizz", "buzz"]} 
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="}.

+0

отличный Дэйв Андерсон Это работает. Спасибо! –

+0

сейчас одна странная проблема, если url = location.href тогда javascript читает как "DZj9aEoyZ2I =" вместо DZj9aEoyZ2I% 3d любая идея как исправить? –

0

В настоящее время в 2016 году, если вы используете 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))