location
объекты уже имеют совершенно хорошие свойства, такие как pathname
, hostname
и т. Д., Которые дают вам отдельные части URL. Используйте свойство .search
вместо попытки взломать URL-адрес как строку (?
может появляться не только в этом месте).
В этом случае происходит разделение на символ &
(и, возможно, ;
, если вы хотите быть хорошим, как в HTML4 B2.2), и проверка каждого параметра на соответствие искомому. В общем случае это требует правильного декодирования URL, так как g%62n_keywords=...
является допустимым способом написания того же параметра. На выходе, естественно, вам нужно будет снова кодировать, чтобы прекратить &
переход к следующему параметру (а также включить другие недопустимые символы).
Вот пара служебных функций, которые вы можете использовать для более удобного управления строкой запроса. Они преобразуются между строкой ?...
, как видно из location.search
или link.search
, и поиском Object
, отображающим имена параметров в массивы значений (поскольку запросы в кодировке формы могут иметь несколько экземпляров одного и того же параметра).
function queryToLookup(query) {
var lookup= {};
var params= query.slice(1).split(/[&;]/);
for (var i= 0; i<params.length; i++) {
var ix= params[i].indexOf('=');
if (ix!==-1) {
var name= decodeURIComponent(params[i].slice(0, ix));
var value= decodeURIComponent(params[i].slice(ix+1));
if (!(name in lookup))
lookup[name]= [];
lookup[name].push(value);
}
}
return lookup;
}
function lookupToQuery(lookup) {
var params= [];
for (var name in lookup)
for (var i= 0; i<lookup[name].length; i++)
params.push(encodeURIComponent(name)+'='+encodeURIComponent(lookup[name][i]));
return params.length===0? '' : '?'+params.join('&');
}
Это упрощает использование:
var lookup= queryToLookup(location.search);
lookup['gbn_keywords']= ['coffee & tea'];
var query= lookupToQuery(lookup);