Обновление: вот статья, которую я написал об этом один раз для HTML Goodies: http://www.htmlgoodies.com/beyond/javascript/article.php/11877_3755006_2
Взгляните на простой ptq
функции (синтаксический-The-запрос), одна из библиотеки функций я написал в 2001 году
function ptq(s, q) {
var i, p;
s = s.replace(/\+/g, ' ').replace(/;/g, '&').split('&');
q = q || {};
for (i=0; i<s.length; i++) {
p = s[i].split('=', 2);
q[unescape(p[0])] = unescape(p[1]);
}
return q;
}
он работает даже с очень старыми версиями JavaScript, и использовать это просто:
var q = ptq(location.search.substring(1));
/* grab query string after the initial "?" delimiter */
Свойство q
будет соответствовать любому name=value
пара, определенному в значениях форм HTML, представленных на текущий URL с помощью строки запроса GET запроса Select в.
Например, если HTML форма содержит поле с именем name
с содержанием «Иосифом», и если эта форма представляются как определено его атрибутом action
к HTML странице file.html
то запрос GET будет «file.html? Имя = Joseph ", а значение q.name
будет равно строковому литералу "Joseph"
.
Некоторые части кода, например escape
/unescape
, имеют более новые и предпочтительные эквиваленты, если в дальнейшем доступны функции JavaScript.
В результате углубления новой версии этого кода вы также можете использовать логические параметры в ваших URL-адресах, таких как «file.html? Name = Joseph & secure», хотя они никогда не будут созданы браузером при отправке HTML-формы. Это также проще в использовании. Просто напишите q = param();
в вашем коде, аналогично синтаксису модуля Cinc.Lincoln D. Stein's CGI.pm.
function ptq(q)
{
/* parse the query */
/* semicolons are nonstandard but we accept them */
var x = q.replace(/;/g, '&').split('&'), i, name, t;
/* q changes from string version of query to object */
for (q={}, i=0; i<x.length; i++)
{
t = x[i].split('=', 2);
name = unescape(t[0]);
if (!q[name])
q[name] = [];
if (t.length > 1)
{
q[name][q[name].length] = unescape(t[1]);
}
/* next two lines are nonstandard */
else
{
q[name][q[name].length] = true;
}
}
return q;
}
function param()
{
return ptq(location.search.substring(1).replace(/\+/g, ' '));
}
Обратите внимание, что в этой новой редакции все поля формы возвращаются как массивы. Это гораздо более уместно, так как стандарт допускает несколько полей формы с тем же именем, что означает, что правильным типом данных для значения поля формы является массив строк.
Может быть, это полезно. http://stackoverflow.com/a/8649003 –
Короткий ответ, как справиться с этим - сначала заменить знаки + пробелами, а затем декодировать остальные данные. Но вам действительно нужен синтаксический анализатор строки запроса. –