Sorgu dizesini URL'den kaldır


145

Javascript'te bir Path'den querystring'i kaldırmanın kolay yolu nedir? Window.location.search kullanan Jquery için bir eklenti gördüm. Bunu yapamam: Benim durumumda URL AJAX ayarlanır bir değişkendir.

var testURL = '/Products/List?SortDirection=dsc&Sort=price&Page=3&Page2=3&SortOrder=dsc'

Yanıtlar:


347

Bunu almanın kolay bir yolu:

function getPathFromUrl(url) {
  return url.split("?")[0];
}

Herhangi bir sorgu dizesi olmadığında karma değerini (orijinal sorunun bir parçası değil) kaldırmak isteyenler için , bu biraz daha fazlasını gerektirir:

function stripQueryStringAndHashFromPath(url) {
  return url.split("?")[0].split("#")[0];
}

DÜZENLE

@caub (aslında @crl), sorgu dizesi ve karma için çalışan daha basit bir kombinasyon önerdi (bununla ilgili bir sorun olması durumunda RegExp kullanıyor olsa da):

function getPathFromUrl(url) {
  return url.split(/[?#]/)[0];
}

4
+1 ... Aslında split () bu durumda subring () yönteminden daha iyidir.
Daniel Vassallo

10
O (muhtemelen) konularda Marjinal optimizasyonu: split('?', 1)[0].
bobince

@ChristianVielma: Bu ?normal bir ifade değil, bir dize değişmezidir.
Robusto

@Robusto Üzgünüm, kötüyüm ... Java ile kontrol ediyordum (ki bu bir normal ifade olarak yorumluyor) :(
Christian Vielma

4
Hey Robusto, neden olmasın .split(/[?#]/)[0]?
15'te caub

32

2. Güncelleme: Kapsamlı bir cevap sunmaya çalışırken, çeşitli cevaplarda önerilen üç yöntemi karşılaştırıyorum.

var testURL = '/Products/List?SortDirection=dsc&Sort=price&Page=3&Page2=3';
var i;

// Testing the substring method
i = 0;
console.time('10k substring');
while (i < 10000) {
    testURL.substring(0, testURL.indexOf('?'));
    i++;
}
console.timeEnd('10k substring');

// Testing the split method
i = 0;
console.time('10k split');
while (i < 10000) {
    testURL.split('?')[0]; 
    i++;
}
console.timeEnd('10k split');

// Testing the RegEx method
i = 0;
var re = new RegExp("[^?]+");
console.time('10k regex');
while (i < 10000) {
    testURL.match(re)[0]; 
    i++;
}
console.timeEnd('10k regex');

Mac OS X 10.6.2'de Firefox 3.5.8 sonuçları:

10k substring:  16ms
10k split:      25ms
10k regex:      44ms

Mac OS X 10.6.2 üzerinde Chrome 5.0.307.11 ile ilgili sonuçlar:

10k substring:  14ms
10k split:      20ms
10k regex:      15ms

URL bir sorgu dizesi içermiyorsa, boş bir dize döndürdüğünden alt dize yönteminin işlev bakımından daha düşük olduğunu unutmayın. Diğer iki yöntem de beklendiği gibi tam URL'yi döndürür. Bununla birlikte, özellikle Firefox'ta alt dize yönteminin en hızlı olduğunu belirtmek ilginçtir.


1. GÜNCELLEME: Aslında Robusto tarafından önerilen split () yöntemi , daha önce önerdiğimden daha iyi bir çözümdür, çünkü sorgu dizisi olmasa bile çalışacaktır:

var testURL = '/Products/List?SortDirection=dsc&Sort=price&Page=3&Page2=3';
testURL.split('?')[0];    // Returns: "/Products/List"

var testURL2 = '/Products/List';
testURL2.split('?')[0];    // Returns: "/Products/List"

Orijinal Yanıt:

var testURL = '/Products/List?SortDirection=dsc&Sort=price&Page=3&Page2=3';
testURL.substring(0, testURL.indexOf('?'));    // Returns: "/Products/List"

10
O_O Gerçekten çok kapsamlı, ama… neden? En esnek ve uygun yöntem açıkça kazanıyor, hız kesinlikle endişe etmiyor.
deceze

1
@deceze: Sadece merak için ... Ve Angus'un cevabının yorumlarında normal ifade yönteminin performansı hakkında bir tartışma olduğu için.
Daniel Vassallo 30'10

6
Çok ilginç, Daniel. Ve bir sayfada 10K URL ayrıştırma yapmak zorunda kalırsam başka bir iş hattı arayacağım. :)
Robusto

Aslında biraz şaşırdım 44ms 10k regex maçlar yapabilirsiniz. Gelecekte, onları daha fazla kullanmaya meyilli olacağımı düşünüyorum.
TheGerm

12

Bu eski bir soru olabilir ama sorgu parametrelerini kaldırmak için bu yöntemi denedim. Sorgu params kaldırılması ile birlikte bir yeniden yükleme gerektiği gibi benim için sorunsuz çalışmak gibi görünüyor.

window.location.href = window.location.origin + window.location.pathname;

Ayrıca basit dize ekleme işlemi kullandığım için performans iyi olacağını tahmin ediyorum. Ama yine de bu cevapta snippet'lerle karşılaştırmaya değer


3

Basit bir yol aşağıdaki gibi yapabilirsiniz

public static String stripQueryStringAndHashFromPath(String uri) {
 return uri.replaceAll(("(\\?.*|\\#.*)"), "");
}

2

RegEx'e giriyorsanız ....

var newURL = testURL.match(new RegExp("[^?]+"))

1
normal ifade yavaş bir - kolay hızlı bir şekilde gidin.
Aristos

1
@Angus: Döngününüz size "Bir komut dosyası meşgul olabilir ..." veriyor çünkü artırmayı unuttunuz a++;. Testleri sabitleyerek, bir iMac 2.93Ghz Core 2 Duo üzerindeki Firefox 3.6'mda, RegEx için 8ms ve split yöntemi için 3ms alıyorum ... Yine de cevap için +1, çünkü yine de başka bir seçenek.
Daniel Vassallo

1
teşekkürler - Birkaç dakika önce düzelttim! - ama önemli olan reg exp işlemi için bile 0.000005 saniye konuştuğunuzda, performans herhangi bir çözüm için bir sorun değildir :-)
plodder 29:10

1
match()bir nesneyi döndürür. Muhtemelen bunu istemiyorsun. Çağrı toString()bunun (veya üzerine +'').
bobince

1
Bob - iyi yakaladın. Aslında bir eşleşme dizisi döndürür - bu durumda bir dizeler dizisi. Yani testURL.match (yeni RegExp ("[^?] +")) [0] yapar
plodder

2
var path = "path/to/myfile.png?foo=bar#hash";

console.log(
    path.replace(/(\?.*)|(#.*)/g, "")
);

2

Backbone.js kullanılıyorsa ( url anchorrota olarak içerir ), url query stringgörünebilir:

  1. önce url anchor:

    var url = 'http://example.com?a=1&b=3#routepath/subpath';
  2. sonra url anchor:

    var url = 'http://example.com#routepath/subpath?a=1&b=3';

Çözüm:

window.location.href.replace(window.location.search, '');
// run as: 'http://example.com#routepath/subpath?a=1&b=3'.replace('?a=1&b=3', '');

1

Standardı kullanan bir yaklaşım URL:

/**
 * @param {string} path - A path starting with "/"
 * @return {string}
 */
function getPathname(path) {
  return new URL(`http://_${path}`).pathname
}

getPathname('/foo/bar?cat=5') // /foo/bar

@Brad daha sonra yol adını döndürdüğünde protokolün önemi nedir?
Aptal


-3
(() => {
        'use strict';
        const needle = 'SortOrder|Page'; // example
        if ( needle === '' || needle === '{{1}}' ) { 
            return; 
        }           
        const needles = needle.split(/\s*\|\s*/);
        const querystripper = ev => {
                    if (ev) { window.removeEventListener(ev.type, querystripper, true);}
                    try {
                          const url = new URL(location.href);
                          const params = new URLSearchParams(url.search.slice(1));
                          for (const needleremover of needles) {
                                if (params.has(needleremover)) {
                                url.searchParams.delete(needleremover);
                                    window.location.href = url;
                            }
                          }     
                    } catch (ex) { }
        };          
        if (document.readyState === 'loading') {
                 window.addEventListener('DOMContentLoaded', querystripper, true);
        } else {
                 querystripper();
        }
})();

Ben böyle yaptım, RegEx desteği de var.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.