Некоторые из решений, размещенных здесь, неэффективны. Повторение поиска регулярного выражения каждый раз, когда сценарий должен получить доступ к параметру, совершенно не нужен, достаточно одной отдельной функции для разделения параметров в объект стиля ассоциативного массива. Если вы не работаете с API истории HTML 5, это необходимо только один раз на загрузку страницы. Другие предложения здесь также не могут правильно декодировать URL.
var urlParams;
(window.onpopstate = function () {
var match,
pl = /\+/g, // Regex for replacing addition symbol with a space
search = /([^&=]+)=?([^&]*)/g,
decode = function (s) { return decodeURIComponent(s.replace(pl, " ")); },
query = window.location.search.substring(1);
urlParams = {};
while (match = search.exec(query))
urlParams[decode(match[1])] = decode(match[2]);
})();
Пример querystring:
blockquote>
?i=main&mode=front&sid=de8d49b78a85a322c4155015fdce22c4&enc=+Hello%20&empty
Результат :
urlParams = { enc: " Hello ", i: "main", mode: "front", sid: "de8d49b78a85a322c4155015fdce22c4", empty: "" } alert(urlParams["mode"]); // -> "front" alert("empty" in urlParams); // -> true
Это можно легко улучшить, чтобы обрабатывать строки строк в стиле массива. Примером этого является здесь , но поскольку параметры стиля массива не определены в RFC 3986 , я не буду загрязнять этот ответ исходным кодом. Для тех, кто интересуется «загрязненной» версией, посмотрите на ответ Campbeln ниже .
Также, как указано в комментариях,
;
является законным разделителем дляkey=value
пар. Для обработки;
или&
потребуется более сложное регулярное выражение, которое, как мне кажется, не нужно, потому что редко используется;
, и я бы сказал, что еще более маловероятно, что оба будут использоваться. Если вам нужно поддерживать;
вместо&
, просто замените их в регулярном выражении.Если вы используете язык предварительной обработки на стороне сервера, вы можете использовать его собственные функции JSON для сделай тяжелый подъем для себя. Например, в PHP вы можете написать:
Гораздо проще!