URL에서 querystring 제거


145

Javascript의 경로에서 쿼리 문자열을 제거하는 쉬운 방법은 무엇입니까? window.location.search를 사용하는 Jquery 용 플러그인을 보았습니다. 나는 할 수 없다 : 내 경우의 URL은 AJAX에서 설정된 변수입니다.

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

답변:


347

이것을 얻는 쉬운 방법은 다음과 같습니다.

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

querystring이 없을 때 해시 (원래 질문의 일부가 아닌) 를 제거 하려는 사람들에게는 조금 더 필요합니다.

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

편집하다

@caub (원래 @crl)는 쿼리 문자열과 해시 모두에서 작동하는 더 간단한 콤보를 제안했습니다 (누구든지 문제가있는 경우 RegExp를 사용하지만).

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

4
+1 ...이 경우 실제로 split ()이 substring ()보다 낫습니다.
Daniel Vassallo

10
중요 할 경우 한계 최적화 (아마도 아님) : split('?', 1)[0].
bobince

@ChristianVielma : ?정규 표현식이 아닌 문자열 리터럴입니다.
Robusto

@Robusto 미안합니다, 내 나쁜 ... 나는 자바에서 확인하고 있습니다 (정규식으로 해석합니다) :(
Christian Vielma

4
안녕 Robusto .split(/[?#]/)[0]?
caub

32

두 번째 업데이트 : 포괄적 인 답변을 제공하기 위해 다양한 답변에서 제안 된 세 가지 방법을 벤치마킹하고 있습니다.

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의 Firefox 3.5.8 결과 :

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

Mac OS X 10.6.2의 Chrome 5.0.307.11 결과 :

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

URL에 쿼리 문자열이 포함되지 않은 경우 빈 문자열을 반환하므로 하위 문자열 메서드의 기능이 떨어집니다. 다른 두 가지 방법은 예상대로 전체 URL을 반환합니다. 그러나 하위 문자열 방법이 특히 Firefox에서 가장 빠릅니다.


첫 번째 업데이트 : 실제로 Robusto제안한 split () 메소드 쿼리 문자열이없는 경우에도 작동하기 때문에 이전에 제안한 것보다 더 나은 솔루션입니다.

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 실제로 매우 포괄적이지만… 왜? 가장 유연하고 적절한 방법이 분명히 승리합니다. 속도는 여기에 전혀 관심이 없습니다.
deceze

1
@deceze : 호기심을 위해서 ... Angus의 답변에 대한 의견에 정규식 방법의 성능에 대한 논쟁이 있었기 때문에.
Daniel Vassallo

6
매우 흥미 롭습니다, 대니얼 그리고 페이지에서 10K URL 구문 분석을 수행 해야하는 경우 다른 작업 라인을 찾으려고합니다. :)
Robusto

나는 실제로 44ms에서 10k 정규 표현식 일치를 할 수 있다는 사실을 알게되었습니다. 앞으로는 더 많이 사용하는 경향이 있다고 생각합니다.
TheGerm

12

이것은 오래된 질문 일 수도 있지만 쿼리 매개 변수를 제거하기 위해이 방법을 시도했습니다. 쿼리 매개 변수 제거와 결합하여 다시로드가 필요했기 때문에 원활하게 작동하는 것 같습니다.

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
정규식은 느리다-쉬운 방법으로 가십시오.
Aristos

1
@Angus : 귀하의 루프를주고있다 "A 스크립트는 바쁜 될 수있다 ..."당신이 증가에 잊어 버려 a++;. iMac 2.93Ghz Core 2 Duo의 Firefox 3.6에서 테스트 수정, RegEx는 8ms, split 메소드는 3ms를 얻습니다. 그럼에도 불구하고 답은 +1입니다. 그럼에도 불구하고 여전히 다른 옵션입니다.
Daniel Vassallo

1
감사합니다-몇 분 전에 고쳤습니다! -그러나 요점은 정규 표현식 작업에서도 0.000005 초를 이야기 할 때입니다. 성능은 어떤 솔루션에서도 문제가되지 않습니다 :-)
plodder

1
match()객체를 반환합니다. 당신은 아마 그것을 원하지 않을 것입니다. 전화 toString()하십시오 (또는 +'').
bobince

1
밥-잘 잡아. 실제로 일치하는 배열,이 경우 문자열 배열을 반환합니다. testURL.match 그래서 (새 정규식 ( "[^?] +")) [0]이 수행
터벅 터벅 걷는

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

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

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

@ 브래드가 나중에 경로명을 반환 할 때 프로토콜이 중요한 것은 무엇입니까?
바보


-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.