Czy istnieje lepszy sposób na usunięcie parametru z ciągu zapytania w ciągu adresu URL w standardowym języku JavaScript inny niż użycie wyrażenia regularnego?
Oto, co do tej pory wymyśliłem, co wydaje się działać w moich testach, ale nie lubię wymyślać na nowo analizowania zapytań!
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" ), "" ); "$1" );
// remove any leftover crud
url = url.replace( /[&;]$/, "" );
return url;
}
javascript
query-string
Matthew Lock
źródło
źródło
url= urlparts[0]+'?'+pars.join('&');
naurl= urlparts[0] + (pars.length > 0 ? '?' + pars.join('&') : "");
Nowoczesne przeglądarki zapewniają
URLSearchParams
interfejs do pracy z parametrami wyszukiwania. Który madelete
metodę, która usuwa parametr według nazwy.źródło
URLSearchParams
nie jest obsługiwane przez przeglądarkę IE, Edge 16 i iOS 10.2 Safari. (ref: caniuse.com/#feat=urlsearchparams )Skopiowano z odpowiedzi bobince, ale sprawiłeś, że obsługuje znaki zapytania w ciągu zapytania, np
http://www.google.com/search?q=test???+something&aq=f
Czy poprawne jest posiadanie więcej niż jednego znaku zapytania w adresie URL?
źródło
???
składnia jest nieprawidłowa i nigdy nie powinna występować w adresie URL`.return url.endsWith("?") ? url.slice(0,-1) : url;
aby uwzględnić przypadek, w którym parametr do usunięcia jest jedynym parametrem w ciągu zapytaniaNie widzę poważnych problemów z rozwiązaniem regex. Ale nie zapomnij o zachowaniu identyfikatora fragmentu (tekst po
#
).Oto moje rozwiązanie:
I do rzeczy bobince'a, tak -
.
w nazwach parametrów musiałbyś uciekać przed znakami.źródło
url.replace(new RegExp('^([^#]*\?)(([^#]*)&)?' + parameter + '(\=[^&#]*)?(&|#|$)' ), '$1$3$5').replace(/^([^#]*)((\?)&|\?(#|$))/,'$1$3$4')
Możesz zmienić adres URL za pomocą:
w ten sposób możesz nadpisać adres URL bez parametru wyszukiwania, używam go do czyszczenia adresu URL po pobraniu parametrów GET.
źródło
Każdy zainteresowany rozwiązaniem regex utworzyłem tę funkcję, aby dodać / usunąć / zaktualizować parametr querystring. Niepodanie wartości spowoduje usunięcie parametru, podanie jednej spowoduje dodanie / zaktualizowanie parametru. Jeśli adres URL nie zostanie podany, zostanie pobrany z window.location. To rozwiązanie uwzględnia również zakotwiczenie adresu URL.
AKTUALIZACJA
Wystąpił błąd podczas usuwania pierwszego parametru z kwerendy, przerobiłem wyrażenie regularne i przetestowałem, aby uwzględnić poprawkę.
AKTUALIZACJA 2
Aktualizacja @schellmax w celu naprawienia sytuacji, w której symbol hashtagu jest tracony podczas usuwania zmiennej zapytania bezpośrednio przed hashtagiem
źródło
UpdateQueryString('a', null, 'http://www.test.com?a=b#c');
url
dla każdej iteracji zastępowania. Ale to oznacza, że musisz wpisać avalue
w argumentach, co spowoduje, że querystring zostanie w połowie usunięty. Aby temu przeciwdziałać, użycieundefined
lubnull
dovalue
argumentu typu:url_from_last_iteration = UpdateQueryString(current_ignore_key, undefined/null, url_from_last_iteration);
Zakładając, że chcesz usunąć parametr key = val z identyfikatora URI:
źródło
/([&?]key=val*$|key=val&|[?&]key=val(?=#))/
może być preferowane, gdy używasz liniowca, takiego jak eslintOto czego używam:
Oryginalny adres URL: http://www.example.com/test/hello?id=123&foo=bar
Docelowy adres URL: http://www.example.com/test/hello
źródło
Oto kompletna funkcja dodawania i usuwania parametrów na podstawie tego pytania i tego githuba: https://gist.github.com/excalq/2961415
Możesz dodać takie parametry:
I usuń to w ten sposób:
W tym wątku wielu powiedziało, że regex prawdopodobnie nie jest najlepszym / stabilnym rozwiązaniem ... więc nie jestem w 100% pewien, czy to coś ma jakieś wady, ale o ile to przetestowałem, działa całkiem dobrze.
źródło
To jest poprawna wersja parametru zapytania usuwająca zapytanie z klasą URL dla dzisiejszych przeglądarek:
URLSearchParams nie są obsługiwane w starszych przeglądarkach
https://caniuse.com/#feat=urlsearchparams
IE, Edge (poniżej 17) i Safari (poniżej 10.3) nie obsługują URLSearchParams w klasie URL.
Polyfills
Tylko wypełnienie URLSearchParams
https://github.com/WebReflection/url-search-params
Uzupełnij adres URL Polyfill i URLSearchParams, aby dopasować je do ostatnich specyfikacji WHATWG
https://github.com/lifaon74/url-polyfill
źródło
Korzystanie z jQuery:
źródło
Powyższa wersja jako funkcja
źródło
Do manipulacji URI powinieneś używać biblioteki, ponieważ jest to bardziej skomplikowane, niż się wydaje na pierwszy rzut oka, aby zrobić to sam. Spójrz na: http://medialize.github.io/URI.js/
źródło
Z tego, co widzę, żadne z powyższych nie obsługuje normalnych parametrów i parametrów tablicy. Oto jeden, który to robi.
Jak tego użyć:
Oczywiście, aby zaktualizować parametr, po prostu usuń, a następnie dodaj. Możesz zrobić dla niego funkcję zastępczą.
źródło
path.replace(new RegExp("&?"+param+"=[\\w]+", "g"), "");
Zmieniłbym wyrażenie regularne tak,[\\w]*
aby zawierało parametry takie jak „param =” bez wartości.Wszystkie odpowiedzi w tym wątku mają tę wadę, że nie zachowują zakotwiczonych / fragmentów adresów URL.
Jeśli więc Twój adres URL wygląda tak:
i zastępujesz „parametr”
stracisz swój fragment tekstu.
Poniżej przedstawiono adaptację poprzednich odpowiedzi (bobince przez LukePH), które rozwiązują ten problem:
źródło
url = urlBase+'?'+pars.join('&');
naurl = urlBase + (pars.length > 0 ? '?' + pars.join('&') : "");
Oto rozwiązanie, które:
?
w ciągu zapytania, jeśli ostatni parametr został usuniętyUwaga: jak wskazano w innych odpowiedziach, URLSearchParams nie jest obsługiwany w IE , więc użyj polyfill .
źródło
Jeśli jest to instancja
URL
, użyjdelete
funkcjisearchParams
źródło
Inną bezpośrednią i prostszą odpowiedzią byłoby
źródło
Zmodyfikowana wersja rozwiązania autorstwa ssh_imov
Zadzwoń tak
źródło
Zwraca adres URL bez DOWOLNYCH parametrów GET:
źródło
Praktycznie napisałem następującą funkcję, aby przetworzyć parametry adresu URL i uzyskać ostateczny status jako ciąg znaków i przekierować stronę. Mam nadzieję, że to przyniesie korzyści.
Na przykład, kiedy klikam przycisk, chcę, aby wartość strony została usunięta, a wartość kategorii została dodana.
Myślę, że to było bardzo przydatne!
źródło
Cieszę się, że przewinąłeś tutaj.
Proponuję rozwiązać to zadanie za pomocą następujących możliwych rozwiązań:
http://google.com/?myparm
http://google.com/?myparm=1
http://google.com?qp=1&qpqp=2&qp=1
for
pętli i nie modyfikuje tablicy podczas jej wykonywania w pętliDziała w IE> 9 (wersja ES5)
Fantazyjna wersja ES6
Zobacz, jak to działa tutaj
źródło
źródło
źródło
Jeśli interesujesz się jQuery, istnieje dobra wtyczka do manipulacji ciągami zapytań:
źródło
źródło