Xóa chuỗi truy vấn khỏi URL


143

Cách dễ dàng để xóa chuỗi truy vấn khỏi Đường dẫn trong Javascript là gì? Tôi đã thấy một plugin cho Jquery sử dụng window.location.search. Tôi không thể làm điều đó: URL trong trường hợp của tôi là một biến được đặt từ AJAX.

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

Câu trả lời:


345

Một cách dễ dàng để có được điều này là:

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

Đối với những người cũng muốn xóa hàm băm (không phải là một phần của câu hỏi ban đầu) khi không có chuỗi truy vấn nào tồn tại , điều đó đòi hỏi thêm một chút:

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

BIÊN TẬP

@caub (ban đầu @crl) đã đề xuất một kết hợp đơn giản hơn, hoạt động cho cả chuỗi truy vấn và hàm băm (mặc dù nó sử dụng RegExp, trong trường hợp bất kỳ ai cũng gặp vấn đề với điều đó):

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

4
+1 ... Trên thực tế, split () tốt hơn chuỗi con () trong trường hợp này.
Daniel Vassallo

10
Tối ưu hóa cận biên nếu nó quan trọng (có thể không) : split('?', 1)[0].
bobince

@ChristianVielma: Đây ?là một chuỗi ký tự, không phải là một biểu thức thông thường.
Robusto

@Robusto Tôi xin lỗi, thật tệ ... Tôi đã kiểm tra nó bằng Java (diễn giải nó là một biểu thức chính quy) :(
Christian Vielma

4
Này Robusto, và tại sao không .split(/[?#]/)[0]?
caub 28/03/2015

32

Cập nhật lần 2: Trong nỗ lực cung cấp câu trả lời toàn diện, tôi đang điểm chuẩn ba phương pháp được đề xuất trong các câu trả lời khác nhau.

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');

Kết quả trong Firefox 3.5.8 trên Mac OS X 10.6.2:

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

Kết quả trong Chrome 5.0.307.11 trên Mac OS X 10.6.2:

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

Lưu ý rằng phương thức chuỗi con kém hơn về chức năng vì nó trả về một chuỗi trống nếu URL không chứa chuỗi truy vấn. Hai phương thức khác sẽ trả về URL đầy đủ, như mong đợi. Tuy nhiên, thật thú vị khi lưu ý rằng phương thức chuỗi con là nhanh nhất, đặc biệt là trong Firefox.


CẬP NHẬT thứ 1: Trên thực tế phương thức split () được đề xuất bởi Robusto là một giải pháp tốt hơn mà tôi đã đề xuất trước đó, vì nó sẽ hoạt động ngay cả khi không có chuỗi truy vấn:

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"

Câu trả lời gốc:

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

10
O_O Thực sự rất toàn diện, nhưng tại sao? Phương pháp linh hoạt và phù hợp nhất rõ ràng là chiến thắng, tốc độ hoàn toàn không phải lo ngại ở đây.
lừa dối

1
@deceze: Chỉ vì tò mò ... Và bởi vì có một cuộc tranh luận về hiệu suất của phương pháp regex trong các bình luận về câu trả lời của Angus.
Daniel Vassallo

6
Rất thú vị, Daniel. Và nếu tôi phải thực hiện phân tích cú pháp URL 10K trên một trang, tôi sẽ tìm kiếm một dòng công việc khác. :)
Robusto

Tôi thực sự bị thổi bay một chút rằng người ta có thể thực hiện 10k trận đấu regex trong 44ms. Trong tương lai, tôi nghĩ rằng tôi sẽ có xu hướng sử dụng chúng nhiều hơn.
TheGerm

12

Đây có thể là một câu hỏi cũ nhưng tôi đã thử phương pháp này để xóa tham số truy vấn. Có vẻ như hoạt động trơn tru đối với tôi vì tôi cần tải lại kết hợp với loại bỏ các tham số truy vấn.

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

Ngoài ra vì tôi đang sử dụng thao tác thêm chuỗi đơn giản nên tôi đoán hiệu suất sẽ tốt. Nhưng vẫn đáng so sánh với đoạn trích trong câu trả lời này


3

Một cách đơn giản là bạn có thể làm như sau

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

2

Nếu bạn vào RegEx ....

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

1
regrec là chậm một - đi với cách nhanh chóng dễ dàng.
Aristos

1
@Angus: Vòng lặp của bạn mang đến cho bạn "Tập lệnh có thể đang bận ..." vì bạn quên tăng a++;. Sửa các bài kiểm tra, trong Firefox 3.6 của tôi trên iMac 2.93Ghz Core 2 Duo, tôi nhận được 8ms cho RegEx và 3ms cho phương pháp phân tách ... Tuy nhiên +1 cho câu trả lời, bởi vì đây vẫn là một tùy chọn khác.
Daniel Vassallo

1
cảm ơn - tôi đã sửa nó vài phút trước! - nhưng điểm mấu chốt là khi bạn đang nói 0.000005 giây ngay cả đối với các hoạt động reg exp, hiệu suất không phải là một vấn đề đối với bất kỳ giải pháp :-)
cần cù

1
match()trả về một đối tượng Bạn có thể không muốn điều đó. Gọi toString()cho nó (hoặc +'').
bobince

1
Bob - bắt tốt. Trên thực tế, nó trả về một mảng các kết quả khớp - một mảng các chuỗi trong trường hợp này. Vì vậy, testURL.match (RegExp mới ("[^?] +")) [0] thực hiện điều đó
plodder

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

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

2

Nếu sử dụng backbone.js (chứa url anchortuyến đường), url query stringcó thể xuất hiện:

  1. trước url anchor:

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

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

Giải pháp:

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

1

Một cách tiếp cận sử dụng tiêu chuẩn 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 giao thức có vấn đề gì khi tất cả những gì anh ta làm là trả lại tên đường dẫn sau đó?
The Fool


-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();
        }
})();

Đó là cách tôi đã làm, cũng có hỗ trợ RegEx.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.