ลบการสอบถามออกจาก URL


145

วิธีง่ายๆในการลบการสอบถามออกจาก Path ใน Javascript คืออะไร? ฉันเคยเห็นปลั๊กอินสำหรับ Jquery ที่ใช้ window.location.search ฉันไม่สามารถทำได้: URL ในกรณีของฉันเป็นตัวแปรที่ตั้งค่าจาก AJAX

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

คำตอบ:


347

วิธีง่ายๆในการรับคือ:

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

สำหรับผู้ที่ต้องการลบแฮช (ไม่ใช่ส่วนหนึ่งของคำถามเดิม) เมื่อไม่มีการสอบถามใดๆ ที่ต้องใช้มากกว่านั้น:

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

แก้ไข

@caub (เดิมที @crl) แนะนำคอมโบที่ง่ายกว่าซึ่งใช้ได้ทั้งกับสตริงข้อความค้นหาและแฮช (แม้ว่าจะใช้ RegExp ในกรณีที่ใครก็ตามมีปัญหา)

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

4
+1 ... จริงแบ่ง () ดีกว่าสตริงย่อย () ในกรณีนี้
Daniel Vassallo

10
การเพิ่มประสิทธิภาพ Marginal ถ้าเรื่อง split('?', 1)[0](อาจจะไม่ได้):
bobince

@ChristianVielma: นี่?คือตัวอักษรสตริงไม่ใช่นิพจน์ทั่วไป
Robusto

@ Robusto ฉันขอโทษฉันไม่ดี ... ฉันกำลังตรวจสอบใน Java (ซึ่งตีความว่าเป็น regex) :(
คริสเตียน Vielma

4
เฮ้ Robusto และทำไมไม่.split(/[?#]/)[0]?
caub

32

การปรับปรุงครั้งที่ 2:ในความพยายามที่จะให้คำตอบที่ครอบคลุมฉันกำลังเปรียบเทียบมาตรฐานสามวิธีที่เสนอในคำตอบที่หลากหลาย

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

ผลลัพธ์ใน Firefox 3.5.8 บน Mac OS X 10.6.2:

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

ผลลัพธ์ใน Chrome 5.0.307.11 บน Mac OS X 10.6.2:

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

โปรดทราบว่าวิธีการสตริงย่อยจะด้อยกว่าในการทำงานเนื่องจากมันจะส่งกลับสตริงว่างถ้า URL ไม่ได้มีการสอบถาม อีกสองวิธีจะคืนค่า URL ตามที่คาดไว้ อย่างไรก็ตามสิ่งที่น่าสนใจคือวิธีการซับสตริงนั้นเร็วที่สุดโดยเฉพาะใน Firefox


1st UPDATE:อันที่จริงวิธีการแยก () ที่แนะนำโดย Robustoเป็นวิธีแก้ปัญหาที่ดีกว่าที่ฉันแนะนำไว้ก่อนหน้านี้เนื่องจากมันจะทำงานแม้ว่าจะไม่มีการสอบถาม:

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"

คำตอบเดิม:

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

10
O_O มีความครอบคลุมมาก แต่…ทำไม วิธีที่ยืดหยุ่นและเหมาะสมที่สุดจะชนะแน่นอนความเร็วนั้นไม่ต้องกังวลเลย
หลอกลวง

1
@deceze: เพียงแค่อยากรู้อยากเห็น ... และเนื่องจากมีข้อโต้แย้งเกี่ยวกับประสิทธิภาพของวิธีการ regex ในความคิดเห็นของคำตอบของ Angus
Daniel Vassallo

6
น่าสนใจมากดาเนียล และถ้าฉันต้องทำ 10K URL แยกวิเคราะห์ในหน้าฉันจะหางานอื่น :)
Robusto

จริงๆแล้วฉันรู้สึกปลื้มนิดหน่อยที่ใคร ๆ ก็สามารถทำได้ 10k regex ใน 44ms ในอนาคตฉันคิดว่าฉันจะใช้มันมากขึ้น
TheGerm

12

นี่อาจเป็นคำถามเก่า แต่ฉันได้ลองวิธีนี้เพื่อลบ params แบบสอบถาม ดูเหมือนว่าจะทำงานได้อย่างราบรื่นสำหรับฉันเพราะฉันต้องการโหลดใหม่รวมกับลบ params แบบสอบถาม

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

นอกจากนี้เนื่องจากฉันใช้การดำเนินการเพิ่มสตริงอย่างง่ายฉันเดาว่าประสิทธิภาพจะดี แต่ก็ยังคุ้มค่าเมื่อเทียบกับตัวอย่างในคำตอบนี้


3

วิธีง่ายๆคือคุณสามารถทำได้ดังนี้

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

2

หากคุณเข้าสู่ RegEx ....

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

1
regexp ช้าไป - ไปกับวิธีที่รวดเร็วง่าย ๆ
Aristos

1
@Angus: ห่วงของคุณให้คุณ "สคริปต์ที่อาจจะไม่ว่าง ..." a++;เพราะคุณลืมที่จะเพิ่มขึ้น แก้ไขการทดสอบใน Firefox 3.6 ของฉันบน iMac 2.93Ghz Core 2 Duo ฉันได้รับ 8ms สำหรับ RegEx และ 3ms สำหรับวิธีการแบ่ง ... อย่างไรก็ตาม +1 สำหรับคำตอบเพราะยังคงเป็นตัวเลือกอื่น
Daniel Vassallo

1
ขอบคุณ - ฉันแก้ไขมันไม่กี่นาทีที่ผ่านมา! - แต่ประเด็นก็คือเมื่อคุณกำลังพูด 0.000005 วินาทีแม้กระทั่งสำหรับการดำเนินงานประสบการณ์ reg ประสิทธิภาพการทำงานไม่เป็นปัญหาสำหรับการแก้ปัญหาใด ๆ :-)
เพียร

1
match()ส่งคืนวัตถุ คุณอาจไม่ต้องการมัน โทรหาtoString()มัน (หรือ+'')
bobince

1
บ๊อบ - จับได้ดี ที่จริงแล้วมันคืนอาร์เรย์ของการจับคู่ - Array of strings ในกรณีนี้ ดังนั้น testURL.match (RegExp ใหม่ ("[^?] +")) [0] ทำมัน
จี้


2

หากใช้ backbone.js (ซึ่งมีurl anchorเส้นทาง) url query stringอาจปรากฏขึ้น:

  1. ก่อนurl anchor:

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

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

สารละลาย:

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

1

วิธีการที่ใช้มาตรฐาน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 โปรโตคอลจะมีความสำคัญอย่างไรเมื่อทุกอย่างที่เขาทำคือคืนชื่อพา ธ ในภายหลัง?
คนโง่


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

นั่นเป็นวิธีที่ฉันทำและยังรองรับ RegEx

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.