Строка запроса JavaScript

Есть ли какая-либо библиотека JavaScript, которая делает словарь из строки запроса, ASP.NET style?

Что-то, что можно использовать как:

var query = window.location.querystring["query"]?

Является ли "строка запроса" чем-то еще вне области .NET? Почему location.search не разбит на коллекцию ключей/значений?

EDIT: я написал свою собственную функцию, но делает ли какая-либо главная библиотека JavaScript?

Ответы

Ответ 2

Вы можете извлечь пары ключ/значение из свойства location.search, это свойство имеет часть URL-адреса, следующего за? символ, включая? символ.

function getQueryString() {
  var result = {}, queryString = location.search.slice(1),
      re = /([^&=]+)=([^&]*)/g, m;

  while (m = re.exec(queryString)) {
    result[decodeURIComponent(m[1])] = decodeURIComponent(m[2]);
  }

  return result;
}

// ...
var myParam = getQueryString()["myParam"];

Ответ 3

tl; dr решение на одной (ish) строке кода с использованием vanilla javascript

var queryDict = {}
location.search.substr(1).split("&").forEach(function(item) {
    queryDict[item.split("=")[0]] = item.split("=")[1]
})

Для querystring ?a=1&b=2&c=3&d&e он возвращает:

> queryDict
a: "1"
b: "2"
c: "3"
d: undefined
e: undefined

многозначные ключи и закодированные символы?

Посмотрите исходный ответ на Как получить значения строки запроса в JavaScript?

"?a=1&b=2&c=3&d&e&a=5&a=t%20e%20x%20t&e=http%3A%2F%2Fw3schools.com%2Fmy%20test.asp%3Fname%3Dståle%26car%3Dsaab"
> queryDict
a: ["1", "5", "t e x t"]
b: ["2"]
c: ["3"]
d: [undefined]
e: [undefined, "http://w3schools.com/my test.asp?name=ståle&car=saab"]

Ответ 4

После того, как я нашел этот пост, когда я посмотрел на себя, я подумал, что должен добавить, что я не думаю, что самое верное решение - лучшее. Он не обрабатывает значения массива (такие как? A = foo & a = bar - в этом случае я ожидал бы, что a вернется ['foo', 'bar']). Это также, насколько я могу судить, не учитывает закодированные значения - например, шестнадцатеричное кодирование символов, где %20 представляет пробел (пример:? A = Hello %20World) или символ плюса, используемый для представления пробела (пример:? a = Hello + World).

Node.js предлагает то, что выглядит как очень полные решения для синтаксического анализа запросов. Это было бы легко вывезти и использовать в вашем собственном проекте, так как оно достаточно хорошо изолировано и под разрешительной лицензией.

Код для этого можно посмотреть здесь: https://github.com/joyent/node/blob/master/lib/querystring.js

Тесты, которые Node можно увидеть здесь: https://github.com/joyent/node/blob/master/test/simple/test-querystring.js Я бы попробовал некоторые из них с популярным ответом, чтобы посмотреть, как он их обрабатывает.

Существует также проект, в который я участвовал, чтобы специально добавить эту функциональность. Это порт стандартного синтаксического анализа строки запроса Python. Мою вилку можно найти здесь: https://github.com/d0ugal/jquery.qeeree

Ответ 5

Или вы можете использовать библиотеку sugar.js.

От sugarjs.com:

Object.fromQueryString(str, deep = true )

Преобразует строку запроса URL-адреса в объект. Если глубина ложна, преобразование будет принимать только мелкие параметры (т.е. нет объекта или массивов с синтаксисом [], поскольку они не поддерживаются повсеместно.

Object.fromQueryString('foo=bar&broken=wear') >{"foo":"bar","broken":"wear"}
Object.fromQueryString('foo[]=1&foo[]=2') >{"foo":[1,2]}

Пример:

var queryString = Object.fromQueryString(location.search);
var foo = queryString.foo;

Ответ 6

Если у вас есть запрос, используйте это:

 /**
 * @param qry the querystring
 * @param name name of parameter
 * @returns the parameter specified by name
 * @author [email protected]
 */

function getQueryStringParameter(qry,name){
    if(typeof qry !== undefined && qry !== ""){
        var keyValueArray = qry.split("&");
        for ( var i = 0; i < keyValueArray.length; i++) {
            if(keyValueArray[i].indexOf(name)>-1){
                return keyValueArray[i].split("=")[1];
            }
        }
    }
    return "";
}

Ответ 7

// How about this
function queryString(qs) {
    var queryStr = qs.substr(1).split("&"),obj={};
    for(var i=0; i < queryStr.length;i++)
        obj[queryStr[i].split("=")[0]] = queryStr[i].split("=")[1];
    return obj;
}

// Usage:
var result = queryString(location.search);

Ответ 8

Код

Следующий код основан на Gist by Eldon McGuinness и, безусловно, является наиболее полной реализацией JavaScript-синтаксический анализатор строк, который я видел до сих пор:

var parseQuery = function (str) {
    var qso = {};
    var qs = (str || document.location.search);
    // Check for an empty querystring
    if (qs == "") {
        return qso;
    }
    // Normalize the querystring
    qs = qs.replace(/(^\?)/, '').replace(/;/g, '&');
    while (qs.indexOf("&&") != -1) {
        qs = qs.replace(/&&/g, '&');
    }
    qs = qs.replace(/([\&]+$)/, '');
    // Break the querystring into parts
    qs = qs.split("&");
    // Build the querystring object
    for (var i = 0; i < qs.length; i++) {
        var qi = qs[i].split("=");
        qi = $.map(qi, function (n) {
            return decodeURIComponent(n)
        });
        if (qso[qi[0]] != undefined) {

            // If a key already exists then make this an object
            if (typeof (qso[qi[0]]) == "string") {
                var temp = qso[qi[0]];
                if (qi[1] == "") {
                    qi[1] = null;
                }
                qso[qi[0]] = [];
                qso[qi[0]].push(temp);
                qso[qi[0]].push(qi[1]);

            } else if (typeof (qso[qi[0]]) == "object") {
                if (qi[1] == "") {
                    qi[1] = null;
                }
                qso[qi[0]].push(qi[1]);
            }
        } else {
            // If no key exists just set it as a string
            if (qi[1] == "") {
                qi[1] = null;
            }
            qso[qi[0]] = qi[1];
        }
    }
    return qso;
};

Как использовать его

var results = parseQuery("?foo=bar&foo=boo&roo=bar;bee=bop;=ghost;=ghost2;&;checkbox%5B%5D=b1;checkbox%5B%5D=b2;dd=;http=http%3A%2F%2Fw3schools.com%2Fmy%20test.asp%3Fname%3Dst%C3%A5le%26car%3Dsaab&http=http%3A%2F%2Fw3schools2.com%2Fmy%20test.asp%3Fname%3Dst%C3%A5le%26car%3Dsaab");

Выход

{
  "foo": ["bar", "boo" ],
  "roo": "bar",
  "bee": "bop",
  "": ["ghost", "ghost2"],
  "checkbox[]": ["b1", "b2"],
  "dd": null,
  "http": [
    "http://w3schools.com/my test.asp?name=ståle&car=saab",
    "http://w3schools2.com/my test.asp?name=ståle&car=saab"
  ]
}

См. также этот скрипт.

Ответ 9

Стоит отметить, что библиотека, упомянутая Джоном Слегерсом, имеет зависимость jQuery, но вот версия, которая является ванильным Javascript.

https://github.com/EldonMcGuinness/querystring.js

Я бы просто прокомментировал его сообщение, но мне не хватает репутации, чтобы сделать это.:/

Пример:

В приведенном ниже примере выполните следующую, хотя и нерегулярную, строку запроса:

?foo=bar&foo=boo&roo=bar;bee=bop;=ghost;=ghost2;&;checkbox%5B%5D=b1;checkbox%5B%5D=b2;dd=;http=http%3A%2F%2Fw3schools.com%2Fmy%20test.asp%3Fname%3Dst%C3%A5le%26car%3Dsaab&http=http%3A%2F%2Fw3schools2.com%2Fmy%20test.asp%3Fname%3Dst%C3%A5le%26car%3Dsaab 

var qs = "?foo=bar&foo=boo&roo=bar;bee=bop;=ghost;=ghost2;&;checkbox%5B%5D=b1;checkbox%5B%5D=b2;dd=;http=http%3A%2F%2Fw3schools.com%2Fmy%20test.asp%3Fname%3Dst%C3%A5le%26car%3Dsaab&http=http%3A%2F%2Fw3schools2.com%2Fmy%20test.asp%3Fname%3Dst%C3%A5le%26car%3Dsaab";
//var qs = "?=&=";
//var qs = ""

var results = querystring(qs);

(document.getElementById("results")).innerHTML =JSON.stringify(results, null, 2);
<script 
src="https://rawgit.com/EldonMcGuinness/querystring.js/master/dist/querystring.min.js"></script>
<pre id="results">RESULTS: Waiting...</pre>

Ответ 10


function decode(s) {
    try {
        return decodeURIComponent(s).replace(/\r\n|\r|\n/g, "\r\n");
    } catch (e) {
        return "";
    }
}
function getQueryString(win) {
    var qs = win.location.search;
    var multimap = {};
    if (qs.length > 1) {
        qs = qs.substr(1);
        qs.replace(/([^=&]+)=([^&]*)/g, function(match, hfname, hfvalue) {
            var name = decode(hfname);
            var value = decode(hfvalue);
            if (name.length > 0) {
                if (!multimap.hasOwnProperty(name)) {
                    multimap[name] = [];
                }
                multimap[name].push(value);
            }
        });
    }
    return multimap;
}
var keys = getQueryString(window);
for (var i in keys) {
    if (keys.hasOwnProperty(i)) {
        for (var z = 0; z < keys[i].length; ++z) {
            alert(i + ":" + keys[i][z]);
        }
    }
}

Ответ 11

Мне нравится держать его простым, читаемым и маленьким.

function searchToObject(search) {
    var pairs = search.substring(1).split("&"),
        obj = {}, pair;

    for (var i in pairs) {
        if (pairs[i] === "") continue;
        pair = pairs[i].split("=");
        obj[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);
    }
    return obj;
}

searchToObject(location.search);

Пример:

searchToObject('?query=myvalue')['query']; // spits out: 'myvalue'

Ответ 12

Функция, которую я написал для требования, аналогичного этому, с чистой обработкой строк javascript

"http://www.google.lk/?Name=John&Age=20&Gender=Male"

function queryize(sampleurl){
    var tokens = url.split('?')[1].split('&');
    var result = {};

    for(var i=0; i<tokens.length; i++){
        result[tokens[i].split('=')[0]] = tokens[i].split('=')[1];
    }

    return result;
}

Использование:

queryize(window.location.href)['Name'] //returns John
queryize(window.location.href)['Age'] //returns 20
queryize(window.location.href)['Gender'] //returns Male

Ответ 13

Если вы используете lodash + ES6, вот однострочное решение: _.object(window.location.search.replace(/(^\?)/, '').split('&').map(keyVal => keyVal.split('=')));

Ответ 14

Хорошо, так как все игнорируют мой фактический вопрос, хе-хе, я тоже отправлю! Вот что у меня есть:

location.querystring = (function() {

    // The return is a collection of key/value pairs

    var queryStringDictionary = {};

    // Gets the query string, starts with '?'

    var querystring = unescape(location.search);

    // document.location.search is empty if no query string

    if (!querystring) {
        return {};
    }

    // Remove the '?' via substring(1)

    querystring = querystring.substring(1);

    // '&' seperates key/value pairs

    var pairs = querystring.split("&");

    // Load the key/values of the return collection

    for (var i = 0; i < pairs.length; i++) {
        var keyValuePair = pairs[i].split("=");
        queryStringDictionary[keyValuePair[0]] = keyValuePair[1];
    }

    // Return the key/value pairs concatenated

    queryStringDictionary.toString = function() {

        if (queryStringDictionary.length == 0) {
            return "";
        }

        var toString = "?";

        for (var key in queryStringDictionary) {
            toString += key + "=" + queryStringDictionary[key];
        }

        return toString;
    };

    // Return the key/value dictionary

    return queryStringDictionary;
})();

И тесты:

alert(window.location.querystring.toString());

for (var key in location.querystring) {
    alert(key + "=" + location.querystring[key]);
}

Помни, ты думал, что JavaScript не мой родной язык.

В любом случае, я ищу библиотеку JavaScript (например, jQuery, Prototype), которая уже написана.:)

Ответ 15

Основываясь на ответе @CMS, у меня есть следующее (в CoffeeScript, которое можно легко преобразовать в JavaScript):

String::to_query = ->
  [result, re, d] = [{}, /([^&=]+)=([^&]*)/g, decodeURIComponent]
  while match = re.exec(if @.match /^\?/ then @.substring(1) else @)
    result[d(match[1])] = d match[2] 
  result

Вы можете легко получить то, что вам нужно:

location.search.to_query()['my_param']

Победа здесь - это объектно-ориентированный интерфейс (а не функциональный), и это может быть сделано для любой строки (а не только для location.search).

Если вы уже используете библиотеку JavaScript, эта функция уже существует. Например вот прототип версии