Как удалить параметр строки запроса в JavaScript?
есть ли лучший способ удалить параметр из строки запроса в строке URL в стандартном JavaScript, кроме как с помощью регулярного выражения?
вот что я придумал до сих пор, кажется, работает в моих тестах, но я не люблю изобретать строке разбора!
function RemoveParameterFromUrl( url, parameter ) {
if( typeof parameter == "undefined" || parameter == null || parameter == "" ) throw new Error( "parameter is required" );
url = url.replace( new RegExp( "b" + parameter + "=[^&;]+[&;]?", "gi" ), "" ); "" );
// remove any leftover crud
url = url.replace( /[&;]$/, "" );
return url;
}
18 ответов:
"[&;]?" + parameter + "=[^&;]+"кажется опасным, потому что это параметр ' bar ' будет соответствовать:
?a=b&foobar=cтакже он потерпит неудачу, если
parameterсодержит любые символы, которые являются специальными в регулярном выражении, например ‘.'. И это не глобальное регулярное выражение, поэтому он удалит только один экземпляр параметра.Я бы не использовал простое регулярное выражение для этого, я бы проанализировал параметры и потерял те, которые вы не хотите.
function removeURLParameter(url, parameter) { //prefer to use l.search if you have a location/link object var urlparts= url.split('?'); if (urlparts.length>=2) { var prefix= encodeURIComponent(parameter)+'='; var pars= urlparts[1].split(/[&;]/g); //reverse iteration as may be destructive for (var i= pars.length; i-- > 0;) { //idiom for string.startsWith if (pars[i].lastIndexOf(prefix, 0) !== -1) { pars.splice(i, 1); } } url= urlparts[0] + (pars.length > 0 ? '?' + pars.join('&') : ""); return url; } else { return url; } }
скопировано из ответа bobince, но сделало его поддержкой вопросительных знаков в строке запроса, например
http://www.google.com/search?q=test???+что-то&aq=f
допустимо ли иметь более одного вопросительного знака в URL-адресе?
function removeUrlParameter(url, parameter) { var urlParts = url.split('?'); if (urlParts.length >= 2) { // Get first part, and remove from array var urlBase = urlParts.shift(); // Join it back up var queryString = urlParts.join('?'); var prefix = encodeURIComponent(parameter) + '='; var parts = queryString.split(/[&;]/g); // Reverse iteration as may be destructive for (var i = parts.length; i-- > 0; ) { // Idiom for string.startsWith if (parts[i].lastIndexOf(prefix, 0) !== -1) { parts.splice(i, 1); } } url = urlBase + '?' + parts.join('&'); } return url; }
Я не вижу серьезных проблем с решением выражения. Но, не забудьте сохранить идентификатор фрагмента (текст после
#).вот мое решение:
function RemoveParameterFromUrl(url, parameter) { return url .replace(new RegExp('[?&]' + parameter + '=[^&#]*(#.*)?$'), '') .replace(new RegExp('([?&])' + parameter + '=[^&]*&'), ''); }и отметить bobince, да - тебе нужно бежать
.символы в именах параметров.
все, кто заинтересован в решении регулярных выражений я собрал эту функцию, чтобы добавить/удалить / обновить параметр querystring. Если не указать значение, параметр будет удален, а если указать, то параметр будет добавлен/обновлен. Если URL-адрес не указан, он будет захвачен из окна.местоположение. Это решение также учитывает привязку url-адреса.
function UpdateQueryString(key, value, url) { if (!url) url = window.location.href; var re = new RegExp("([?&])" + key + "=.*?(&|#|$)(.*)", "gi"), hash; if (re.test(url)) { if (typeof value !== 'undefined' && value !== null) return url.replace(re, '' + key + "=" + value + ''); else { hash = url.split('#'); url = hash[0].replace(re, '').replace(/(&|\?)$/, ''); if (typeof hash[1] !== 'undefined' && hash[1] !== null) url += '#' + hash[1]; return url; } } else { if (typeof value !== 'undefined' && value !== null) { var separator = url.indexOf('?') !== -1 ? '&' : '?'; hash = url.split('#'); url = hash[0] + separator + key + '=' + value; if (typeof hash[1] !== 'undefined' && hash[1] !== null) url += '#' + hash[1]; return url; } else return url; } }обновление
была ошибка при удалении первого параметра в строке запроса, у меня есть переработано регулярное выражение и тест, чтобы включить исправление.
обновление 2
@schellmax обновление, чтобы исправить ситуацию, когда символ хэштега теряется при удалении переменной строки запроса непосредственно перед хэштегом
современные браузеры обеспечить
URLSearchParamsинтерфейс для работы с параметрами поиска. Который имеетdeleteметод, который удаляет param по имени.if (typeof URLSearchParams !== 'undefined') { const params = new URLSearchParams('param1=1¶m2=2¶m3=3') console.log(params.toString()) params.delete('param2') console.log(params.toString()) } else { console.log(`Your browser ${navigator.appVersion} does not support URLSearchParams`) }
предполагая, что вы хотите удалить параметр key=val из URI:
function removeParam(uri) { return uri.replace(/([&\?]key=val*$|key=val&|[?&]key=val(?=#))/, ''); }
вот полная функция для добавления и удаления параметров на основе этого вопроса и этого GitHub gist: https://gist.github.com/excalq/2961415
var updateQueryStringParam = function (key, value) { var baseUrl = [location.protocol, '//', location.host, location.pathname].join(''), urlQueryString = document.location.search, newParam = key + '=' + value, params = '?' + newParam; // If the "search" string exists, then build params from it if (urlQueryString) { updateRegex = new RegExp('([\?&])' + key + '[^&]*'); removeRegex = new RegExp('([\?&])' + key + '=[^&;]+[&;]?'); if( typeof value == 'undefined' || value == null || value == '' ) { // Remove param if value is empty params = urlQueryString.replace(removeRegex, ""); params = params.replace( /[&;]$/, "" ); } else if (urlQueryString.match(updateRegex) !== null) { // If param exists already, update it params = urlQueryString.replace(updateRegex, "" + newParam); } else { // Otherwise, add it to end of query string params = urlQueryString + '&' + newParam; } } window.history.replaceState({}, "", baseUrl + params); };вы можете добавить такие параметры:
updateQueryStringParam( 'myparam', 'true' );и удалить его так:
updateQueryStringParam( 'myparam', null );В этой теме многие говорили, что регулярное выражение, вероятно, не самое лучшее/стабильное решение ... так что я не на 100% уверен, что у этой вещи есть некоторые недостатки, но насколько я ее тестировал, она работает довольно штраф.
вышеуказанная версия как функция
function removeURLParam(url, param) { var urlparts= url.split('?'); if (urlparts.length>=2) { var prefix= encodeURIComponent(param)+'='; var pars= urlparts[1].split(/[&;]/g); for (var i=pars.length; i-- > 0;) if (pars[i].indexOf(prefix, 0)==0) pars.splice(i, 1); if (pars.length > 0) return urlparts[0]+'?'+pars.join('&'); else return urlparts[0]; } else return url; }
С помощью jQuery:
function removeParam(key) { var url = document.location.href; var params = url.split('?'); if (params.length == 1) return; url = params[0] + '?'; params = params[1]; params = params.split('&'); $.each(params, function (index, value) { var v = value.split('='); if (v[0] != key) url += value + '&'; }); url = url.replace(/&$/, ''); url = url.replace(/\?$/, ''); document.location.href = url; }
вы должны использовать библиотеку для выполнения манипуляций с URI, поскольку это сложнее, чем кажется на поверхности, чтобы сделать это самостоятельно. Взгляните на: http://medialize.github.io/URI.js/
из того, что я вижу, ни один из вышеперечисленных не может обрабатывать нормальные параметры и параметры массива. Вот один, который делает.
function removeURLParameter(param, url) { url = decodeURI(url).split("?"); path = url.length == 1 ? "" : url[1]; path = path.replace(new RegExp("&?"+param+"\[\d*\]=[\w]+", "g"), ""); path = path.replace(new RegExp("&?"+param+"=[\w]+", "g"), ""); path = path.replace(/^&/, ""); return url[0] + (path.length ? "?" + path : ""); } function addURLParameter(param, val, url) { if(typeof val === "object") { // recursively add in array structure if(val.length) { return addURLParameter( param + "[]", val.splice(-1, 1)[0], addURLParameter(param, val, url) ) } else { return url; } } else { url = decodeURI(url).split("?"); path = url.length == 1 ? "" : url[1]; path += path.length ? "&" : ""; path += decodeURI(param + "=" + val); return url[0] + "?" + path; } }Как использовать:
url = location.href; -> http://example.com/?tags[]=single&tags[]=promo&sold=1 url = removeURLParameter("sold", url) -> http://example.com/?tags[]=single&tags[]=promo url = removeURLParameter("tags", url) -> http://example.com/ url = addURLParameter("tags", ["single", "promo"], url) -> http://example.com/?tags[]=single&tags[]=promo url = addURLParameter("sold", 1, url) -> http://example.com/?tags[]=single&tags[]=promo&sold=1конечно, чтобы обновить параметр, просто удалите, а затем добавьте. Не стесняйтесь сделать фиктивную функцию для него.
все ответы в этом потоке имеют недостаток в том, что они не сохраняют якорные/фрагментные части URL-адресов.
Так что если Ваш URL выглядит так:
http://dns-entry/path?parameter=value#fragment-textи вы заменяете 'параметр'
вы потеряете фрагмент текста.
ниже приводится адаптация предыдущих ответов (bobince через LukePH), которая решает эту проблему:
function removeParameter(url, parameter) { var fragment = url.split('#'); var urlparts= fragment[0].split('?'); if (urlparts.length>=2) { var urlBase=urlparts.shift(); //get first part, and remove from array var queryString=urlparts.join("?"); //join it back up var prefix = encodeURIComponent(parameter)+'='; var pars = queryString.split(/[&;]/g); for (var i= pars.length; i-->0;) { //reverse iteration as may be destructive if (pars[i].lastIndexOf(prefix, 0)!==-1) { //idiom for string.startsWith pars.splice(i, 1); } } url = urlBase + (pars.length > 0 ? '?' + pars.join('&') : ''); if (fragment[1]) { url += "#" + fragment[1]; } } return url; }
вы можете изменить URL-адрес:
window.history.pushState({}, document.title, window.location.pathname);таким образом, вы можете перезаписать URL-адрес без параметра поиска, я использую его для очистки URL-адреса после получения параметров GET.
модифицированная версия решения ssh_imov
function removeParam(uri, keyValue) { var re = new RegExp("([&\?]"+ keyValue + "*$|" + keyValue + "&|[?&]" + keyValue + "(?=#))", "i"); return uri.replace(re, ''); }звоните вот так
removeParam("http://google.com?q=123&q1=234&q2=567", "q1=234"); // returns http://google.com?q=123&q2=567
Это возвращает URL без каких-либо параметров GET:
var href = document.location.href; var search = document.location.search; var pos = href.indexOf( search ); if ( pos !== -1 ){ href = href.slice( 0, pos ); console.log( href ); }
вот что я использую:
if (location.href.includes('?')) { history.pushState({}, null, location.href.split('?')[0]); }оригинальный URL:http://www.example.com/test/hello?id=123&foo=bar
Целевой URL: http://www.example.com/test/hello
function removeQueryStringParameter(uri, key, value) { var re = new RegExp("([?&])" + key + "=.*?(&|$)", "i"); var separator = uri.indexOf('?') !== -1 ? "&" : "?"; if (uri.match(re)) { return uri.replace(re, ''); } }
Comments