GET 매개 변수에서 값을 얻는 방법은 무엇입니까?


1327

다음과 같이 GET 매개 변수가있는 URL이 있습니다.

www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5 

의 전체 가치를 얻어야합니다 c. URL을 읽으려고했지만 m2. JavaScript를 사용하여이 작업을 어떻게 수행합니까?


새 답변을 게시하기 전에이 질문에 대한 답변이 이미 50 개 이상있는 것을 고려하십시오. 귀하의 답변이 기존 답변에 속하지 않은 정보를 제공하는지 확인하십시오.
janniks

답변:


1998

JavaScript 자체 에는 쿼리 문자열 매개 변수를 처리하기위한 기본 제공 기능이 없습니다.

(현대) 브라우저에서 실행되는 코드는 URL객체 (브라우저가 JS에 제공하는 API의 일부)를 사용할 수 있습니다 .

var url_string = "http://www.example.com/t.html?a=1&b=3&c=m2-m3-m4-m5"; //window.location.href
var url = new URL(url_string);
var c = url.searchParams.get("c");
console.log(c);


이전 브라우저 (Internet Explorer 포함)의 경우이 polyfill 또는 이전 버전의이 답변의 코드를 사용할 수 있습니다 URL.

URL location.search에서 ?문자 끝까지 또는 조각 식별자 (#foo)의 시작 (둘 중 빠른 것 중 하나)을 제공하는에 액세스 할 수 있습니다 .

그런 다음 다음과 같이 구문 분석 할 수 있습니다.

function parse_query_string(query) {
  var vars = query.split("&");
  var query_string = {};
  for (var i = 0; i < vars.length; i++) {
    var pair = vars[i].split("=");
    var key = decodeURIComponent(pair[0]);
    var value = decodeURIComponent(pair[1]);
    // If first entry with this name
    if (typeof query_string[key] === "undefined") {
      query_string[key] = decodeURIComponent(value);
      // If second entry with this name
    } else if (typeof query_string[key] === "string") {
      var arr = [query_string[key], decodeURIComponent(value)];
      query_string[key] = arr;
      // If third or later entry with this name
    } else {
      query_string[key].push(decodeURIComponent(value));
    }
  }
  return query_string;
}

var query_string = "a=1&b=3&c=m2-m3-m4-m5";
var parsed_qs = parse_query_string(query_string);
console.log(parsed_qs.c);

다음을 사용하여 현재 페이지의 URL에서 쿼리 문자열을 얻을 수 있습니다.

var query = window.location.search.substring(1);
var qs = parse_query_string(query);

구형 브라우저의 경우에 대한 폴리 필URL 외에도 폴리 필 이 필요할 수 있습니다 URLSearchParams. 또는 var c = url.searchParams.get("c");위 답변 의 줄 을 로 바꾸면이 문제를 피할 수 있습니다 var c = new URLSearchParams(window.location.search).get("c");.
evanrmurphy

base64로 인코딩 된 값을 값으로 전달할 때와 같이 '='가 포함 된 값의 경우 parse_query_string이 실패합니다. 아래 정규 표현식을 사용하는 버전이 더 좋습니다.
Manel Clos

7
@Jamland — 절대로 그렇게하지 마십시오. 문제가 발생합니다. 라이브 데모 new URL() 는 올바르게 인코딩 된 URL을 인수로받을 것으로 예상합니다. 전체 URL이 아닌 URL decodeURIComponent구성 요소 가 전달 될 것으로 예상합니다 .
Quentin

@Quentin 나는 다른 특수 문자를 확인했으며 당신이 옳다는 것을 알았습니다. decodeURIComponent이 경우에는 사용해서는 안됩니다
Jamland

1
parse_query_string함수는의 이중 디코딩을 수행 value합니다. 가 =@ManelClos 언급 발행은 두번째 파라미터 부가함으로써 해결 될 수있다 2( limit로)를 vars[i].split().
Jake

242

내가 본 대부분의 구현은 이름과 값을 URL 디코딩하는 것을 놓쳤다.

올바른 URL 디코딩을 수행하는 일반적인 유틸리티 함수는 다음과 같습니다.

function getQueryParams(qs) {
    qs = qs.split('+').join(' ');

    var params = {},
        tokens,
        re = /[?&]?([^=]+)=([^&]*)/g;

    while (tokens = re.exec(qs)) {
        params[decodeURIComponent(tokens[1])] = decodeURIComponent(tokens[2]);
    }

    return params;
}

//var query = getQueryParams(document.location.search);
//alert(query.foo);

3
이 코드는 작동하지 않습니다. 정규식은 현재 색인을 재설정하는 루프 정의에서 컴파일되기 때문에 무한 루프를 만듭니다. 정규식을 루프 외부의 변수에 넣으면 올바르게 작동합니다.
maxhawkins

2
@ maxhawkins : 일부 브라우저에서는 작동하지만 다른 브라우저에서는 무한 루프로 진행됩니다. 당신은 그런 점에서 반 맞습니다. 코드를 크로스 브라우저로 수정하겠습니다. 지적 해 주셔서 감사합니다!
Ates Goral

3
@ZiTAL이 함수는 전체 URL이 아닌 URL의 쿼리 부분과 함께 사용됩니다. 아래의 주석 처리 된 사용 예를 참조하십시오.
Ates Goral

1
@Harvey Case insensitivity는 쿼리 매개 변수와 관련이 없습니다. 쿼리 매개 변수 추출과 함께 또는 위에 적용해야하는 응용 프로그램 관련 항목처럼 들립니다.
Ates Goral

7
qs.split('+').join(' ');그렇지 qs.replace(/\+/g, ' ');않습니까?
FlameStorm

234

출처

function gup( name, url ) {
    if (!url) url = location.href;
    name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
    var regexS = "[\\?&]"+name+"=([^&#]*)";
    var regex = new RegExp( regexS );
    var results = regex.exec( url );
    return results == null ? null : results[1];
}
gup('q', 'hxxp://example.com/?q=abc')

8
이 옵션이 가장 마음에 들지만 null 또는 결과를 반환하지만 빈 문자열은 반환하지 않는 것이 좋습니다.
Jason Thrasher

1
추가 이스케이프 문자가있는 것 같습니다. "\\[" 해야한다 "\[". 이것들은 정규 문자열이므로 [와]는 이스케이프 처리 할 필요가 없습니다.
EricP

대소 문자를 구분하지 않습니다. 대소 문자를 구분하지 않기 위해 "i"를 어디에 추가합니까?
zeta

alert (gup ( 'UserID', window.location.href));
Arun Prasad ES

6
@mottie dead link
invot

202

이것은 하나의 매개 변수를 확인하는 쉬운 방법입니다.

URL 예 :

    http://myserver/action?myParam=2

자바 스크립트 예제 :

    var myParam = location.search.split('myParam=')[1]

URL에 "myParam"이 있으면 변수 myParam에 "2"가 포함되고 그렇지 않으면 정의되지 않습니다.

이 경우 기본값을 원할 수도 있습니다.

    var myParam = location.search.split('myParam=')[1] ? location.search.split('myParam=')[1] : 'myDefaultValue';

업데이트 : 이것은 더 잘 작동합니다.

    var url = "http://www.example.com/index.php?myParam=384&login=admin"; // or window.location.href for current url
    var captured = /myParam=([^&]+)/.exec(url)[1]; // Value is in [1] ('384' in our case)
    var result = captured ? captured : 'myDefaultValue';

URL에 매개 변수가 가득 찬 경우에도 올바르게 작동합니다.


36
이것은 잡아 당기는 매개 변수가 URL의 마지막 매개 변수 인 경우에만 작동합니다 (하나의 매개 변수 만 예상하더라도). 예를 들면 http://myserver/action?myParam=2&anotherParam=3하지 얻을 것입니다 "2""2&anotherParam=3".
Glacials

39
(location.search.split('myParam=')[1]||'').split('&')[0]- 여러 매개 변수 또는 가능한 누락 과 함께 사용 myParam합니다.
Gábor Imre

또는location.search.split('myParam=').splice(1).join('').split('&')[0]
J.Steve

1
[?|&][?|&]myParam=([^&]+)
1.21 기가 와트

1
값을 해독해야 할 수도 있습니다result = decodeURIComponent(result);
1.21 기가 와트

126

브라우저 공급 업체는 URL 및 URLSearchParams를 통해이를 수행하는 기본 방법을 구현했습니다.

let url = new URL('http://www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5');
let searchParams = new URLSearchParams(url.search);
console.log(searchParams.get('c'));  // outputs "m2-m3-m4-m5"

Firefox, Opera, Safari, Chrome 및 Edge에서 현재 지원됩니다. 브라우저 지원 목록 은 여기를 참조하십시오 .

https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams https://developer.mozilla.org/en-US/docs/Web/API/URL/URL

https://url.spec.whatwg.org/

Google 엔지니어 인 Eric Bidelman 은 지원되지 않는 브라우저 에이 폴리 필 을 사용 하도록 권장 합니다.


MDN 링크에 따르면 Safari는 URL을 지원하지만 URLSearchParams는 지원하지 않습니다.
Mark Thomson

3
@Markouver 폴리 필이 처리하지 않습니까? BTW, Safari는 현대 일 'IE6입니다
사바 토스

왜 나를 위해 new URLSearchParams("www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5").get('a')돌아 오는가 null? (Chrome에서 안정적). bc잘 작동하는 것 같다.
ripper234

답변이 업데이트되었습니다. 내 원래 답변은 URL의 검색어 문자열 부분에서만 작동하도록 설계 되었기 때문에 URLSearchParams를 올바르게 사용하지 않았습니다.
cgatian

1
url.searchParams대신 사용하십시오 new URLSearchParams(url.search).
Caio Tarifa

86

나는 이것을 아주 쉽게 발견했다.

function getUrlVars() {
    var vars = {};
    var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi,    
    function(m,key,value) {
      vars[key] = value;
    });
    return vars;
  }

그런 다음 다음과 같이 호출하십시오.

var fType = getUrlVars()["type"];

7
+1 훌륭한 솔루션-우아하고 효율적이며 지능적인 사용 조건입니다. 내 목적을 위해 다른 허용 솔루션보다 우수
Elemental

짧음 + 단순 + 강력 =
훌륭함

1
아주 훌륭합니다
.

1
@pdxbmw 쓸모가 없으며 제거해야합니다. 코드는 언뜻보기에는 영리 해 보이지만 잘 생각되지는 않습니다. 개선 사항 : decodeURIComponent()가치를 활용하십시오 . 일반적으로 작업하기를 원하기 때문입니다. 전체 URL이 아닌 매개 변수에만 관심이 있으므로를 window.location.search대신 사용 window.location.href하십시오.
Leif

2
@ Leif 제안은 훌륭했습니다. URL의 끝에 버튼 클릭시 생성 된 #이기 때문에 ID 142 #를 얻었습니다. 이 같은 기능을 떠나var vars = {}; window.location.search.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) { vars[key] = value; }); return vars;
앙드레 라모스

77

에서 쿼리 문자열을 가져올 수 있으며 location.search물음표 다음에 모든 것을 나눌 수 있습니다.

var params = {};

if (location.search) {
    var parts = location.search.substring(1).split('&');

    for (var i = 0; i < parts.length; i++) {
        var nv = parts[i].split('=');
        if (!nv[0]) continue;
        params[nv[0]] = nv[1] || true;
    }
}

// Now you can get the parameters you want like so:
var abc = params.abc;

3
매개 변수 이름과 값을 URL 디코딩하는 것은 어떻습니까?
Ates Goral

이 방법은 배열을 처리하지 않습니다. 예를 들어을 ?array[]=1&array[]=2생성 {"array[]": "2"}하는데 이는 분명히 잘못입니다.
Kafoso

@Kafoso 여기에 명확한 옳고 그름은 없습니다. 우선, 동일한 이름을 가진 반복 필드에는 지정된 표준 동작이 없으며 파서가 처리해야합니다. 또한 []패턴은 일부 경우 (예 : PHP)에만 의미가 있지만 다른 경우에는 의미가 없습니다. 따라서 "분명히 잘못"된 것이 아니라 처리해야하거나 처리하지 않아도되는 비표준 사례를 처리하도록 구현되지 않았습니다.
Blixt

38

나는 더 간단하고 우아한 해결책을 썼습니다.

var arr = document.URL.match(/room=([0-9]+)/)
var room = arr[1];

이 두 줄을보고 주석에 표시된 내용을 정확하게 수행하십시오. 누군가가 취약점을 조사하려고 시도하고 이러한 솔루션과 달리 추가 문자와 쿼리를 추가하더라도 중단되지 않습니다. 건배!
David G

이것은 두 줄로만 올바르게 작동합니다. 좋은 답변입니다!
Andres Ramos

다른 null 검사가 포함되어 있으면 편리 할 것이라고 생각합니다. 그렇지 않은 경우 예제는 다음과 같습니다. stackoverflow.com/a/36076822/1945948 (편집 시도가 거부되었습니다).
atw

이해가 안됩니다 ...이 질문에 어떻게 대답합니까? 'www.test.com/t.html? a = 1 & b = 3 & c = m2-m3-m4-m5'라는 특정 문자열에서 매개 변수를 얻는 것과 관련이 있습니까?
마이크 설치류

이 답변을 좋아하고 +1했습니다. 그냥 제안, 당신은 대체 할 수 있습니다 [0-9] 에 대한\d
gmanjon

31

URLSearchParams를 사용하는 매우 간단한 방법 입니다.

function getParam(param){
  return new URLSearchParams(window.location.search).get(param);
}

그것은 현재 크롬, 파이어 폭스, 사파리, 에지 및 지원 것 .


Edge에서 실행할 때 'SCRIPT5009 :'URLSearchParams '가 정의되지 않았습니다'오류가 발생합니다.
Andreas Presthammer

@AndreasPresthammer 어떤 버전의 Edge?
spencer.sm

@ spencer-sm Microsoft Edge 41.16299.820.0
Andreas Presthammer

미리 정의 된 URL 매개 변수와 함께 작동하지 않음
ii iml0sto1

@ iiiml0sto1 "확장 된 URL 매개 변수"란 무엇입니까?
spencer.sm 2009 년

30

다음은 정규 표현식이없고 최소한의 돌연변이가있는 재귀 솔루션입니다 (params 객체 만 변경되어 JS에서는 피할 수 없다고 생각합니다).

그것이 굉장하기 때문에 :

  • 재귀
  • 같은 이름의 여러 매개 변수를 처리합니다
  • 잘못된 매개 변수 문자열 (결 측값 등)을 잘 처리합니다.
  • '='가 값에 있으면 중단되지 않습니다.
  • URL 디코딩을 수행합니다
  • 그리고 마지막으로, 그것은 굉장합니다 ... 아아!

암호:

var get_params = function(search_string) {

  var parse = function(params, pairs) {
    var pair = pairs[0];
    var parts = pair.split('=');
    var key = decodeURIComponent(parts[0]);
    var value = decodeURIComponent(parts.slice(1).join('='));

    // Handle multiple parameters of the same name
    if (typeof params[key] === "undefined") {
      params[key] = value;
    } else {
      params[key] = [].concat(params[key], value);
    }

    return pairs.length == 1 ? params : parse(params, pairs.slice(1))
  }

  // Get rid of leading ?
  return search_string.length == 0 ? {} : parse({}, search_string.substr(1).split('&'));
}

var params = get_params(location.search);

// Finally, to get the param you want
params['c'];

31
당신은 ... 당신은 재귀를 두 번 말했다.
반대 분노

다음 URL에서 첫 번째 매개 변수를 찾을 수 없습니다 : www.mysite.com?first=1&second=2
Mario Radomanana

: 안녕하세요 마리오, 여기에 해당 URL 작업을 보여주는 JSFiddle입니다 jsfiddle.net/q6xfJ을 - 당신이 오류를 발견 한 경우이 아마도 브라우저 별은? 테스트 할 때 제공 한 답변은 URL의 '? first = 1 & second = 2'부분 인 location.search를 사용합니다. 건배 :)
Jai

45
왜 재귀 적이라는 이유로 왜 좋은지 알지 못합니다.
Adam Arold

6
음, 아담이 재귀 농담을 놓친 것 같아요. edi9999가 두 번째 "재귀 적"을 제거했기 때문에 이제는 모든 사람들이 그것을 놓칠 것입니다.
Jai

27

나는 이것을하는 기능을 만들었다 :

var getUrlParams = function (url) {
  var params = {};
  (url + '?').split('?')[1].split('&').forEach(function (pair) {
    pair = (pair + '=').split('=').map(decodeURIComponent);
    if (pair[0].length) {
      params[pair[0]] = pair[1];
    }
  });
  return params;
};

2017 년 5 월 26 일 업데이트, 여기에 ES7 구현이 있습니다 (바벨 사전 설정 단계 0, 1, 2 또는 3으로 실행).

const getUrlParams = url => `${url}?`.split('?')[1]
  .split('&').reduce((params, pair) =>
    ((key, val) => key ? {...params, [key]: val} : params)
    (...`${pair}=`.split('=').map(decodeURIComponent)), {});

일부 테스트 :

console.log(getUrlParams('https://google.com/foo?a=1&b=2&c')); // Will log {a: '1', b: '2', c: ''}
console.log(getUrlParams('/foo?a=1&b=2&c')); // Will log {a: '1', b: '2', c: ''}
console.log(getUrlParams('?a=1&b=2&c')); // Will log {a: '1', b: '2', c: ''}
console.log(getUrlParams('https://google.com/')); // Will log {}
console.log(getUrlParams('a=1&b=2&c')); // Will log {}

2018 년 3 월 26 일 업데이트, 여기에 Typescript 구현이 있습니다.

const getUrlParams = (search: string) => `${search}?`
  .split('?')[1]
  .split('&')
  .reduce(
    (params: object, pair: string) => {
      const [key, value] = `${pair}=`
        .split('=')
        .map(decodeURIComponent)

      return key.length > 0 ? { ...params, [key]: value } : params
    },
    {}
  )

2019 년 2 월 13 일 업데이트, TypeScript 3에서 작동하는 업데이트 된 TypeScript 구현이 있습니다.

interface IParams { [key: string]: string }

const paramReducer = (params: IParams, pair: string): IParams => {
  const [key, value] = `${pair}=`.split('=').map(decodeURIComponent)

  return key.length > 0 ? { ...params, [key]: value } : params
}

const getUrlParams = (search: string): IParams =>
  `${search}?`.split('?')[1].split('&').reduce<IParams>(paramReducer, {})

쿼리 매개 변수없이 URL에이 돌아갑니다Object {"": ""}
일리아 세메 노프

2
나에게 충분히 깨끗해 보인다. 나머지 답변은 충분한 설명없이 너무 많은 "마법"입니다.
Levi Roberts

이것은 멋진 답변입니다!
스펜서 Bigum

감사합니다 @SpencerBigum!
Nate Ferrero

24

이것 좀 봐

function getURLParameters(paramName)
{
    var sURL = window.document.URL.toString();
    if (sURL.indexOf("?") > 0)
    {
        var arrParams = sURL.split("?");
        var arrURLParams = arrParams[1].split("&");
        var arrParamNames = new Array(arrURLParams.length);
        var arrParamValues = new Array(arrURLParams.length);

        var i = 0;
        for (i = 0; i<arrURLParams.length; i++)
        {
            var sParam =  arrURLParams[i].split("=");
            arrParamNames[i] = sParam[0];
            if (sParam[1] != "")
                arrParamValues[i] = unescape(sParam[1]);
            else
                arrParamValues[i] = "No Value";
        }

        for (i=0; i<arrURLParams.length; i++)
        {
            if (arrParamNames[i] == paramName)
            {
                //alert("Parameter:" + arrParamValues[i]);
                return arrParamValues[i];
            }
        }
        return "No Parameters Found";
    }
}

1
감사. 나는 jscript를 처음 사용하는데 이것은 매우 도움이 될 것이다.
Brian B.

20

ECMAScript 6 솔루션 :

var params = window.location.search
  .substring(1)
  .split("&")
  .map(v => v.split("="))
  .reduce((map, [key, value]) => map.set(key, decodeURIComponent(value)), new Map())

좋은. 참고로, Map이기 때문에 사용법은 params.get ( "key");
evanmcd

나는 그것을 좋아하지만 아마도 첫 번째 매개 변수를 얻지 못할 것입니다. 나는 당신의 예에 따라 함수 생성 function urlParams(url) { const [, searchParams = ''] = url.split('?') return searchParams.split('&') .map(v => v.split('=')) .reduce((map, [key = '', value]) => key.length ? map.set(key, decodeURIComponent(value)) : map, new Map()) }
mah.cr

11

나는 사용한다

function getVal(str) {
    var v = window.location.search.match(new RegExp('(?:[\?\&]'+str+'=)([^&]+)'));
    return v ? v[1] : null;
}

설명을 추가하십시오. 귀하의 답변은 현재 "품질이 낮음"으로 표시되어 있으며 결국에는 삭제 될 수 있습니다.
Johannes Jander

URL 끝에 '#id'와 같은 문자열이 있으면 'somevalue # id'와 같은 마지막 매개 변수 값을 반환합니다.
Ayano

@Ayano window.location.search는 같은 해시를 포함하지 않습니다 #id.
Fancyoung

@Fancyoung 네, 맞습니다, location.href대신에 결과와 일치 하는 데 실수를했습니다 location.search. 감사합니다.
Ayano

11

parseUri 라이브러리를 사용합니다 . 요청한 내용을 정확하게 수행 할 수 있습니다.

var uri = 'www.test.com/t.html&a=1&b=3&c=m2-m3-m4-m5';
var c = uri.queryKey['c'];
// c = 'm2-m3-m4-m5'

9

여기 내 해결책이 있습니다. Andy E 가이 질문에 대답하는 동안 조언했듯이 여러 정규 표현식 문자열을 반복적으로 작성하고 루프를 실행하여 단일 값을 얻으면 스크립트 성능에 좋지 않습니다. 따라서 모든 GET 매개 변수를 단일 객체로 반환하는 더 간단한 스크립트를 만들었습니다. 한 번만 호출하고 결과를 변수에 할당 한 다음 나중에 언제라도 적절한 키를 사용하여 해당 변수에서 원하는 값을 가져와야합니다. 또한 URI 디코딩 (예 : % 20)을 처리하고 +를 공백으로 바꿉니다.

 function getUrlQueryParams(url) {
  var queryString = url.split("?")[1];
  var keyValuePairs = queryString.split("&");
  var keyValue = [];
  var queryParams = {};
  keyValuePairs.forEach(function(pair) {
    keyValue = pair.split("=");
    queryParams[keyValue[0]] = decodeURIComponent(keyValue[1]).replace(/\+/g, " ");
});
  return queryParams;
}

다음은 스크립트에 대한 몇 가지 테스트입니다.

// Query parameters with strings only, no special characters.
var currentParams = getUrlQueryParams("example.com/foo?number=zero");
alert(currentParams["number"]); // Gives "zero".

// For the URL you stated above...
var someParams = getUrlQueryParams("www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5 ");
alert(someParams["c"]); // Gives "m2-m3-m4-m5".

// For a query params with URI encoding...
var someParams = getUrlQueryParams("www.example.com/t.html?phrase=a%20long%20shot&location=Silicon+Valley%2C+USA");
alert(someParams["phrase"]); // Gives "a long shot".
alert(someParams["location"]); // Gives "Silicon Valley, USA".

.replace ( "+", "")는 첫 번째 항목 만 대체합니다. .replace (/ \ + / g, "");
Tony

8

또는 URI 구문 분석 휠을 재발 명하지 않으려면 URI.js를 사용 하십시오.

foo라는 매개 변수의 값을 얻으려면 다음을 수행하십시오.

new URI((''+document.location)).search(true).foo

그게 뭐야

  1. document.location을 문자열로 변환하십시오 (객체입니다).
  2. 해당 문자열을 URI.js의 URI 클래스 구성자에 공급하십시오.
  3. search () 함수를 호출하여 URL의 검색 (쿼리) 부분을 가져옵니다
    (true를 전달하면 객체를 출력하도록 알려줍니다)
  4. 결과 객체의 foo 속성에 액세스하여 값을 가져옵니다.

여기에 바이올린이 있습니다 .... http://jsfiddle.net/m6tett01/12/


8

들어 단일 매개 변수 값 이 index.html을 같이? MSG = 1 사용 코드 다음,

$(window).load(function(){
    queryString();
});

function queryString()
{
    var queryString = window.location.search.substring(1);
    var varArray = queryString.split("="); //eg. index.html?msg=1

    var param1 = varArray[0];
    var param2 = varArray[1];

}

대한 모든 매개 변수 값을 사용, 코드를 다음

$(window).load(function(){
    queryString();
});

function queryString()
{
    var queryString = window.location.search;
    var varArray = queryString.split("&");
    for (var i=0;i<varArray.length;i++) {
      var param = varArray[i].split("=");
        //parameter-value pair
    }
} 

1
나는이 해결책을 좋아한다!
alemur

8

여기에 하나의 예를 게시하고 있습니다. 그러나 jQuery에 있습니다. 그것이 다른 사람들을 도울 것입니다 :

<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="jquery.url.js"></script>

<!-- URL:  www.example.com/correct/?message=done&year=1990-->

<script type="text/javascript">
$(function(){
    $.url.attr('protocol')  // --> Protocol: "http"
    $.url.attr('path')          // --> host: "www.example.com"
    $.url.attr('query')         // --> path: "/correct/"
    $.url.attr('message')   // --> query: "done"
    $.url.attr('year')      // --> query: "1990"
});
</script>

1
다른 게시물에서 복사 : "plugins.jquery.com/url의 URL 플러그인이 필요"
제타

8

가장 짧은 방법 :

new URL(location.href).searchParams.get("my_key");

2
URL의 첫 번째 쿼리 매개 변수를 검색 할 때 후자가 실패하기 때문에 new URL(location.href).searchParams.get("my_key")over를 사용 하는 것이 URLSearchParams좋습니다.
트래비스 클라크

1
두 변종을 모두 테스트했습니다. 동의합니다. 답변을 수정했습니다.
Zon

7

이 질문에 답변이 너무 많아서 다른 질문을 추가하고 있습니다.

/**
 * parses and returns URI query parameters 
 * 
 * @param {string} param parm
 * @param {bool?} asArray if true, returns an array instead of a scalar 
 * @returns {Object|Array} 
 */
function getURIParameter(param, asArray) {
    return document.location.search.substring(1).split('&').reduce(function(p,c) {
        var parts = c.split('=', 2).map(function(param) { return decodeURIComponent(param); });
        if(parts.length == 0 || parts[0] != param) return (p instanceof Array) && !asArray ? null : p;
        return asArray ? p.concat(parts.concat(true)[1]) : parts.concat(true)[1];
    }, []);
}

용법:

getURIParameter("id")  // returns the last id or null if not present
getURIParameter("id", true) // returns an array of all ids

이것은 빈 매개 변수 (키없이 존재하는 키 "=value"), 스칼라 및 배열 기반 값 검색 API의 노출 및 적절한 URI 구성 요소 디코딩에 대처 합니다.


7

이 방법을 사용하는 가장 쉬운 replace()방법 :

로부터 urlStr문자열 :

paramVal = urlStr.replace(/.*param_name=([^&]*).*|(.*)/, '$1');

또는 현재 URL에서 :

paramVal = document.URL.replace(/.*param_name=([^&]*).*|(.*)/, '$1');

설명:

  • document.URL -interface는 문서 위치 (페이지 URL)를 문자열로 반환합니다.
  • replace()-메소드는 패턴 의 일부 또는 전부 가 대체로 대체 된 새 문자열을 리턴합니다. .
  • /.*param_name=([^&]*).*/- 정규식 슬래시로 묶인 패턴은 다음을 의미합니다.
    • .* -0 개 이상의 문자
    • param_name= -매개 변수 이름,
    • () -정규식으로 그룹화
    • [^&]* -다음을 제외한 모든 문자 중 하나 이상 & ,
    • | -교대
    • $1 -정규식의 첫 번째 그룹에 대한 참조.

var urlStr = 'www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5';
var c = urlStr.replace(/.*c=([^&]*).*|(.*)/, '$1');
var notExisted = urlStr.replace(/.*not_existed=([^&]*).*|(.*)/, '$1');
console.log(`c === '${c}'`);
console.log(`notExisted === '${notExisted}'`);


1
좋은 해결책이지만 매개 변수를 찾지 못하면 전체 문자열이 반환됩니다. 이 경우 "정의되지 않음"이 예상됩니다.
pensan

1
안녕하세요 @ 펜산, 좋은 의견 감사합니다. 매개 변수가 URL에 나타나지 않을 때 상황 처리를 정규식에 추가합니다. 이 경우 전체 문자열이 아닌 emty 문자열을 얻습니다.
simhumileco

6

또 다른 제안.

이미 좋은 답변이 있지만, 나는 그것들이 불필요하게 복잡하고 이해하기 어렵다는 것을 알았습니다. 짧고 간단하며 URL의 토큰 이름에 해당하는 키 이름을 가진 간단한 연관 배열을 반환합니다.

배우고 싶은 사람들을 위해 아래에 주석이 달린 버전을 추가했습니다.

이것은 루프를 위해 jQuery ($ .each)에 의존합니다 .forEach 대신 권장합니다. 이전 브라우저에서 지원되지 않는 새로운 기능을 지원하기 위해 개별 수정 프로그램을 연결하는 대신 jQuery를 사용하여 크로스 브라우저 호환성을 보장하는 것이 더 간단하다는 것을 알았습니다.

편집 :이 글을 쓴 후 나는 Eric Elliott의 대답을 알았습니다 .Each는 위와 같은 이유로 일반적으로 반대하지만 forEach를 사용하지만 거의 동일합니다.

function getTokens(){
    var tokens = [];
    var query = location.search;
    query = query.slice(1);
    query = query.split('&');
    $.each(query, function(i,value){    
        var token = value.split('=');   
        var key = decodeURIComponent(token[0]);     
        var data = decodeURIComponent(token[1]);
        tokens[key] = data;
    });
    return tokens;
}

댓글 버전 :

function getTokens(){
    var tokens = [];            // new array to hold result
    var query = location.search; // everything from the '?' onward 
    query = query.slice(1);     // remove the first character, which will be the '?' 
    query = query.split('&');   // split via each '&', leaving us an array of something=something strings

    // iterate through each something=something string
    $.each(query, function(i,value){    

        // split the something=something string via '=', creating an array containing the token name and data
        var token = value.split('=');   

        // assign the first array element (the token name) to the 'key' variable
        var key = decodeURIComponent(token[0]);     

        // assign the second array element (the token data) to the 'data' variable
        var data = decodeURIComponent(token[1]);

        tokens[key] = data;     // add an associative key/data pair to our result array, with key names being the URI token names
    });

    return tokens;  // return the array
}

아래 예에서는이 주소를 가정합니다.

http://www.example.com/page.htm?id=4&name=murray

URL 토큰을 자신의 변수에 할당 할 수 있습니다.

var tokens = getTokens();

그런 다음 다음과 같이 이름으로 각 URL 토큰을 참조하십시오.

document.write( tokens['id'] );

"4"가 인쇄됩니다.

함수에서 직접 토큰 이름을 참조 할 수도 있습니다.

document.write( getTokens()['name'] );

"murray"를 인쇄합니다.


6
// Read a page's GET URL variables and return them as an associative array.
function getUrlVars()
{
    var vars = [], hash;
    var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
    for(var i = 0; i < hashes.length; i++)
    {
        hash = hashes[i].split('=');
        vars.push(hash[0]);
        vars[hash[0]] = hash[1];
    }
    return vars;
}

// Usage for URL: http://my.site.com/location?locationId=53cc272c0364aefcb78756cd&shared=false
var id = getUrlVars()["locationId"];

여기에서 얻었습니다 : http://jquery-howto.blogspot.ru/2009/09/get-url-parameters-values-with-jquery.html


6

간단한 방법

function getParams(url){
        var regex = /[?&]([^=#]+)=([^&#]*)/g,
            params = {},
            match;
        while(match = regex.exec(url)) {
            params[match[1]] = match[2];
        }
        return params;
    }

그런 다음 getParams (url)처럼 호출하십시오.


5

URL GET 변수를 읽고 url 매개 변수를 기반으로 작업을 완료해야했습니다. 나는 해결책을 찾기 위해 높고 낮은 것을 찾고이 작은 코드를 보았습니다. 기본적으로 현재 페이지 URL을 읽고 URL에서 정규 표현식을 수행 한 다음 URL 매개 변수를 연관 배열에 저장하여 쉽게 액세스 할 수 있습니다.

예를 들어 하단에 자바 스크립트가있는 다음 URL이있는 경우.

http://TestServer/Pages/NewsArchive.aspx?year=2013&Month=July

매개 변수 id와 page를 얻기 위해해야 ​​할 일은 다음과 같습니다.

강령은 다음과 같습니다.

<script type="text/javascript">
var first = getUrlVars()["year"];
var second = getUrlVars()["Month"];

alert(first);
alert(second);
function getUrlVars() {
var vars = {};
var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) {
vars[key] = value;
});
return vars;
}
</script>

감사합니다
OJB1

5
// http:localhost:8080/path?param_1=a&param_2=b
var getParamsMap = function () {
    var params = window.location.search.split("&");
    var paramsMap = {};
    params.forEach(function (p) {
        var v = p.split("=");
        paramsMap[v[0]]=decodeURIComponent(v[1]);
    });
    return paramsMap;
};

// -----------------------

console.log(getParamsMap()["param_1"]);  // should log "a"     

'?'와 함께 첫 번째 매개 변수를 리턴합니다.
Pini Cheyni 2012 년

5

Eldon McGuinness의 Gist 는 지금까지 본 JavaScript 쿼리 문자열 파서의 가장 완벽한 구현입니다.

불행히도, 그것은 jQuery 플러그인으로 작성되었습니다.

나는 그것을 바닐라 JS에 다시 쓰고 몇 가지 개선을했습니다.

function parseQuery(str) {
  var qso = {};
  var qs = (str || document.location.search);
  // Check for an empty querystring
  if (qs == "") {
    return qso;
  }
  // Normalize the querystring
  qs = qs.replace(/(^\?)/, '').replace(/;/g, '&');
  while (qs.indexOf("&&") != -1) {
    qs = qs.replace(/&&/g, '&');
  }
  qs = qs.replace(/([\&]+$)/, '');
  // Break the querystring into parts
  qs = qs.split("&");
  // Build the querystring object
  for (var i = 0; i < qs.length; i++) {
    var qi = qs[i].split("=");
    qi = qi.map(function(n) {
      return decodeURIComponent(n)
    });
    if (typeof qi[1] === "undefined") {
      qi[1] = null;
    }
    if (typeof qso[qi[0]] !== "undefined") {

      // If a key already exists then make this an object
      if (typeof (qso[qi[0]]) == "string") {
        var temp = qso[qi[0]];
        if (qi[1] == "") {
          qi[1] = null;
        }
        qso[qi[0]] = [];
        qso[qi[0]].push(temp);
        qso[qi[0]].push(qi[1]);

      } else if (typeof (qso[qi[0]]) == "object") {
        if (qi[1] == "") {
          qi[1] = null;
        }
        qso[qi[0]].push(qi[1]);
      }
    } else {
      // If no key exists just set it as a string
      if (qi[1] == "") {
        qi[1] = null;
      }
      qso[qi[0]] = qi[1];
    }
  }
  return qso;
}

// DEMO
console.log(parseQuery("?foo=bar&foo=boo&roo=bar;bee=bop;=ghost;=ghost2;&;checkbox%5B%5D=b1;checkbox%5B%5D=b2;dd=;http=http%3A%2F%2Fw3schools.com%2Fmy%20test.asp%3Fname%3Dst%C3%A5le%26car%3Dsaab&http=http%3A%2F%2Fw3schools2.com%2Fmy%20test.asp%3Fname%3Dst%C3%A5le%26car%3Dsaab"));

이 바이올린을 참조하십시오 .


내가 자바 스크립트에 대해 이해하지 못하는 것은 왜 언어 구문 분석 기능을 언어 자체 또는 적어도 표준 라이브러리에 넣지 않았습니까? 저수준의 물건은 이것이 반복해서 다시 발명되어서는 안되며 개발자가 채찍질 할 엔트로 픽 변형 솔루션을 활용하도록 개발자에게 맡겨서는 안됩니다. 이것이 확실하다면, 이와 같은 것을 표준 라이브러리로 만들어야합니다. 이것은 자바 스크립트에서 언어를 끄는 유형의 예입니다.
ahnbizcad

5

우아하고 기능적인 스타일 솔루션

URL 매개 변수 이름을 키로 포함하는 객체를 만든 다음 이름으로 매개 변수를 쉽게 추출 할 수 있습니다.

// URL: https://example.com/?test=true&orderId=9381  

// Build an object containing key-value pairs
export const queryStringParams = window.location.search
  .split('?')[1]
  .split('&')
  .map(keyValue => keyValue.split('='))
  .reduce<QueryStringParams>((params, [key, value]) => {
    params[key] = value;
    return params;
  }, {});

type QueryStringParams = {
  [key: string]: string;
};


// Return URL parameter called "orderId"
return queryStringParams.orderId;

이것을 사랑하지만 감소 기능으로 누산기를 반환하지 않고는 나를 위해 일하지 않았다
Ella

@Ella 그것은 오타였습니다. 없이는 작동 할 수있는 방법이 없습니다return

지금은 더 좋아 보입니다. 첫 페이지로 가길 바랍니다!
Ella

4

여기 내가하는 일이 있습니다.

var uriParams = getSearchParameters();
alert(uriParams.c);


// background functions:

// Get object/associative array of URL parameters
function getSearchParameters () {
  var prmstr = window.location.search.substr(1);
  return prmstr !== null && prmstr !== "" ? transformToAssocArray(prmstr) : {};
}

// convert parameters from url-style string to associative array
function transformToAssocArray (prmstr) {
  var params = {},
      prmarr = prmstr.split("&");

  for (var i = 0; i < prmarr.length; i++) {
    var tmparr = prmarr[i].split("=");
    params[tmparr[0]] = tmparr[1];
  }
  return params;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.