JavaScript를 사용하여 현재 URL에서 쿼리 문자열을 얻는 방법은 무엇입니까?


108

다음과 같은 URL이 있습니다.

http://localhost/PMApp/temp.htm?ProjectID=462

내가해야 할 일은 ?부호 (쿼리 문자열) 다음에 세부 정보를 얻는 것입니다 ProjectID=462. JavaScript를 사용하여 어떻게 얻을 수 있습니까?

지금까지 내가 한 일은 다음과 같습니다.

var url = window.location.toString();
url.match(?);

다음에 무엇을해야할지 모르겠습니다.



@Cupcake : 그 질문이는 것에 대해 여기에, 추출 매개 변수에 관한 것입니다location.search
BERGI

재 개설에 투표하면 표시된 중복은 라이브러리에 대한 요청이지만이 질문은 js 코드를 얻는 것에 관한 것입니다.
1615903


답변:


238

MDN 기사를 살펴 보십시오.window.location .

QueryString은 window.location.search.

레거시 브라우저에서도 작동하는 솔루션

MDN 은 QueryString에서 사용할 수있는 단일 키의 값을 가져 오는 방법에 대한 예제 (위의 참조 문서에서 더 이상 사용할 수 없음) 를 제공합니다. 이 같은:

function getQueryStringValue (key) {  
  return decodeURIComponent(window.location.search.replace(new RegExp("^(?:.*[&\\?]" + encodeURIComponent(key).replace(/[\.\+\*]/g, "\\$&") + "(?:\\=([^&]*))?)?.*$", "i"), "$1"));  
}  

// Would write the value of the QueryString-variable called name to the console  
console.log(getQueryStringValue("name")); 

최신 브라우저에서

최신 브라우저에서는 searchParams 에는 URLSearchParams 객체 를 반환하는 URL 인터페이스 속성이 있습니다. 반환 된 객체에는 get-method를 포함하여 여러 가지 편리한 메서드가 있습니다. 따라서 위의 예와 동일한 것은 다음과 같습니다.

let params = (new URL(document.location)).searchParams;
let name = params.get("name");

그만큼 URLSearchParams의 인터페이스는 쿼리 문자열 형식의 구문 분석 문자열을 사용하고, 편리한 URLSearchParams 객체로 만들어 놓을 수 있습니다.

let paramsString = "name=foo&age=1337"
let searchParams = new URLSearchParams(paramsString);

searchParams.has("name") === true; // true
searchParams.get("age") === "1337"; // true

이 인터페이스에서는 브라우저 지원이 여전히 제한되어 있으므로 기존 브라우저를 지원해야하는 경우 첫 번째 예제를 사용하거나 polyfill을 사용 하세요 .


참고 : 항상 encodeURIComponent/decodeURIComponent대신 사용escape/unescape
tsh

1
getQueryStringValue레거시 브라우저 의 첫 번째 함수 는에서 작동하지 않습니다 .에 ?foo=bar&foo1=bar1 대한 값을 가져 오려고 foo하면을 반환합니다 empty string.
Farhan Chauhan

오래된 브라우저 (IE)를 사용할 수 있습니다 URLSearchParams에 대한 polyfill을
Pratyush

@Pratyush 예, 더 인기 있고 더 자주 업데이트되는 url-search-params-polyfill 패키지에 대한 참조와 함께 대답에서 언급했습니다 .
Christofer Eliasson

57

포함window.location.search 후 모든 것을 얻으려면 사용? ?

예:

var url = window.location.search;
url = url.replace("?", ''); // remove the ?
alert(url); //alerts ProjectID=462 is your case

15
또는 더 간단합니다 :let querystring = window.location.search.substring(1);
olibre

15
decodeURI(window.location.search)
  .replace('?', '')
  .split('&')
  .map(param => param.split('='))
  .reduce((values, [ key, value ]) => {
    values[ key ] = value
    return values
  }, {})

훌륭한! 감사합니다.
Ron16

좋은 접근입니다. 감사. 불이 들어 와서 수정하십시오 : replace는 전체 (!) 문자열을 확인합니다. 첫 번째 문자를 제거해야합니다. 불필요한 루프 제거. 결과 : window.location.search window.location.search.substr (1) .split ( "&") .reduce ((acc, param) => {const [key, value] = param.split ( "=") ; return {... acc, [key] : value};}, {})
Nikita

7

이것은 queryString 변수에 맵으로 액세스하는 전역 함수를 추가합니다.

// -------------------------------------------------------------------------------------
// Add function for 'window.location.query( [queryString] )' which returns an object
// of querystring keys and their values. An optional string parameter can be used as
// an alternative to 'window.location.search'.
// -------------------------------------------------------------------------------------
// Add function for 'window.location.query.makeString( object, [addQuestionMark] )'
// which returns a queryString from an object. An optional boolean parameter can be
// used to toggle a leading question mark.
// -------------------------------------------------------------------------------------
if (!window.location.query) {
    window.location.query = function (source) {
        var map = {};
        source = source || this.search;

        if ("" != source) {
            var groups = source, i;

            if (groups.indexOf("?") == 0) {
                groups = groups.substr(1);
            }

            groups = groups.split("&");

            for (i in groups) {
                source = groups[i].split("=",
                    // For: xxx=, Prevents: [xxx, ""], Forces: [xxx]
                    (groups[i].slice(-1) !== "=") + 1
                );

                // Key
                i = decodeURIComponent(source[0]);

                // Value
                source = source[1];
                source = typeof source === "undefined"
                    ? source
                    : decodeURIComponent(source);

                // Save Duplicate Key
                if (i in map) {
                    if (Object.prototype.toString.call(map[i]) !== "[object Array]") {
                        map[i] = [map[i]];
                    }

                    map[i].push(source);
                }

                // Save New Key
                else {
                    map[i] = source;
                }
            }
        }

        return map;
    }

    window.location.query.makeString = function (source, addQuestionMark) {
        var str = "", i, ii, key;

        if (typeof source == "boolean") {
            addQuestionMark = source;
            source = undefined;
        }

        if (source == undefined) {
            str = window.location.search;
        }
        else {
            for (i in source) {
                key = "&" + encodeURIComponent(i);

                if (Object.prototype.toString.call(source[i]) !== "[object Array]") {
                    str += key + addUndefindedValue(source[i]);
                }
                else {
                    for (ii = 0; ii < source[i].length; ii++) {
                        str += key + addUndefindedValue(source[i][ii]);
                    }
                }
            }
        }

        return (addQuestionMark === false ? "" : "?") + str.substr(1);
    }

    function addUndefindedValue(source) {
        return typeof source === "undefined"
            ? ""
            : "=" + encodeURIComponent(source);
    }
}

즐겨.


5

사용할 일이 있다면 타이프 라이터를 하고있는 DOM 당신의에 LIBtsconfig.json, 당신은 할 수 있습니다 :

const url: URL = new URL(window.location.href);
const params: URLSearchParams = url.searchParams;
// get target key/value from URLSearchParams object
const yourParamValue: string = params.get('yourParamKey');

// To append, you can also leverage api to avoid the `?` check 
params.append('newKey', 'newValue');

4

이 함수는? id =에서 문자열을 분할하는 데 사용할 수 있습니다.

 function myfunction(myvar){
  var urls = myvar;
  var myurls = urls.split("?id=");
  var mylasturls = myurls[1];
  var mynexturls = mylasturls.split("&");
  var url = mynexturls[0];
  alert(url)
}
myfunction(window.top.location.href);
myfunction("http://www.myname.com/index.html?id=dance&emp;cid=in_social_facebook-hhp-food-moonlight-influencer_s7_20160623");

여기 바이올린입니다


4

매개 변수 이름을 통해 값을 직접 찾는 데 사용할 수 있습니다.

const urlParams = new URLSearchParams(window.location.search);
const myParam = urlParams.get('myParam');


2

개체 의 search속성을 사용 window.location하여 URL의 쿼리 부분을 가져올 수 있습니다 . 구문 분석 방법에 영향을 미치는 경우를 대비하여 시작 부분에 물음표 (?)가 포함되어 있습니다.



2
  var queryObj = {};
   if(url.split("?").length>0){
     var queryString = url.split("?")[1];
   }

이제 queryString에 쿼리 부분이 있습니다.

첫 번째 바꾸기는 모든 공백을 제거하고 두 번째는 모든 '&'부분을 ""로 바꾸고 마지막으로 세 번째 바꾸기는 '='기호 대신 ":"을 넣습니다.

queryObj = JSON.parse('{"' + queryString.replace(/"/g, '\\"').replace(/&/g, '","').replace(/=/g,'":"') + '"}')

따라서 abc = 123 & efg = 456 과 같은 쿼리가 있다고 가정 해 보겠습니다 . 이제 구문 분석하기 전에 쿼리가 { "abc": "123", "efg": "456"}와 같은 형식으로 변환됩니다. 이제 이것을 파싱 할 때 json 객체에서 쿼리를 제공합니다.


이 코드가 질문에 답할 수 있지만 문제를 해결하는 방법 및 / 또는 이유에 대한 추가 컨텍스트를 제공하면 답변의 장기적인 가치가 향상됩니다.
Badacadabra

2

그것을 배열로 변환 한 다음 '?'로 분할합니다.

var url= 'http://localhost/PMApp/temp.htm?ProjectID=462';

url.split('?')[1];     //ProjectID=462


0

이거 한번 해봐

/**
 * Get the value of a querystring
 * @param  {String} field The field to get the value of
 * @param  {String} url   The URL to get the value from (optional)
 * @return {String}       The field value
 */
var getQueryString = function ( field, url ) {
    var href = url ? url : window.location.href;
    var reg = new RegExp( '[?&]' + field + '=([^&#]*)', 'i' );
    var string = reg.exec(href);
    return string ? string[1] : null;
};

URL이 http : //example.com&this=chicken&that=sandwich 라고 가정 해 보겠습니다 . 당신은 이것, 저것 그리고 다른 것의 가치를 얻고 싶습니다.

var thisOne = getQueryString('this'); // returns 'chicken'
var thatOne = getQueryString('that'); // returns 'sandwich'
var anotherOne = getQueryString('another'); // returns null

창에있는 URL이 아닌 다른 URL을 사용하려면 하나를 두 번째 인수로 전달할 수 있습니다.

var yetAnotherOne = getQueryString('example', 'http://another-example.com&example=something'); // returns 'something'

참고


0

독창적 인 정규식보다 브라우저에 의존하는 것이 더 안전하다고 생각합니다.

const parseUrl = function(url) { 
  const a = document.createElement('a')
  a.href = url
  return {
    protocol: a.protocol ? a.protocol : null,
    hostname: a.hostname ? a.hostname : null,
    port: a.port ? a.port : null,
    path: a.pathname ? a.pathname : null,
    query: a.search ? a.search : null,
    hash: a.hash ? a.hash : null,
    host: a.host ? a.host : null  
  }
}

console.log( parseUrl(window.location.href) ) //stacksnippet
//to obtain a query
console.log( parseUrl( 'https://example.com?qwery=this').query )

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.