자바 스크립트 쿼리 문자열 [닫힘]


106

쿼리 문자열, ASP.NET스타일 로 사전을 만드는 JavaScript 라이브러리가 있습니까?

다음과 같이 사용할 수있는 것 :

var query = window.location.querystring["query"]?

가요 "쿼리 문자열은" 외부 뭔가 다른라는 .NET영역? 키 / 값 컬렉션location.search 으로 분리 되지 않는 이유는 무엇 입니까?

편집 : 내 자신의 함수를 작성했지만 주요 JavaScript 라이브러리가 이것을 수행합니까?





1
@davidtaubmann이 나이가 많으면 역이 될 것입니다. 그들이 본질적으로 똑같은 것을 묻는다는 것은 재미 있지만 질문의 형식으로 인해 영광은 커뮤니티의 영광으로 바뀌었고 다른 하나는 주제에서 벗어난 것으로 마감되었습니다.
Andre Figueiredo

답변:


11

37
이것은 jquery의 기본이어야합니다
gcb 2011

@EvanMulawski 감사합니다. 플러그인이 사라진 것 같습니다. 도움이 될만한 다른 링크를 추가했습니다.
Shadow2531 2011

CMS에서 제공하는 방법은 더 쉽고 깔끔합니다. Esp. 아직 jquery를 사용하지 않는 경우.
jcoffland

1
이를 위해이 라이브러리를 참조 할 수 있습니다.- github.com
Mikhus

1
다음은 적절한 링크입니다. plugins.jquery.com/query-object
thexfactor 2014

230

location.search 속성 에서 키 / 값 쌍을 추출 할 수 있습니다 .이 속성에는? 다음에 오는 URL 부분이 있습니다. 기호 (? 상징.

function getQueryString() {
  var result = {}, queryString = location.search.slice(1),
      re = /([^&=]+)=([^&]*)/g, m;

  while (m = re.exec(queryString)) {
    result[decodeURIComponent(m[1])] = decodeURIComponent(m[2]);
  }

  return result;
}

// ...
var myParam = getQueryString()["myParam"];

11
이것은 승리가 아닙니다. 키 값에 '='문자가 있으면 어떻게됩니까? 예 : dork.com/?equation=10=2. URL로 인코딩해야하지만 반드시 그럴 필요는 없다고 주장 할 수 있습니다. 이런 순진한 함수를 직접 작성하는 실수를 한 번했습니다. 이 함수가 설명하는 두 개 이상의 엣지 케이스가 있습니다.
JamesBrownIsDead

6
@James, 몇 달 전에 함수를 수정했음을 언급하는 것을 잊었습니다. 이제 올바르게 예제를 처리 할 수 ​​있습니다 dork.com/?equation=10=2...
CMS

2
@CMS 이것은 ?val=foo&val=bar&val=baz 당신이 이것을 어떻게 수용하겠습니까? 와 같이 표현되는 쿼리 문자열의 배열 가능성을 처리하지 않습니다 .
Russ Bradberry 2010

2
@RussBradberry 당신은 정말로 가질 수 없습니다 val=foo&val=bar&val=baz; 그럴 것입니다val[]=foo&val[]=bar&val[]=baz
Brian Driscoll 2011

1
내 값에 공백이 있었고, 나의 바르가와 종료 때 나에게 불완전 보였다 %20의 '나는 대체 있도록 result[keyValuePair[0]] = keyValuePair[1] || '';함께result[keyValuePair[0]] = decodeURIComponent((keyValuePair[1]+'').replace(/\+/g, '%20')) || '';
user24601

22

바닐라 자바 ​​스크립트를 사용하여 한 줄의 코드에 대한 tl; dr 솔루션

var queryDict = {}
location.search.substr(1).split("&").forEach(function(item) {
    queryDict[item.split("=")[0]] = item.split("=")[1]
})

쿼리 문자열의 ?a=1&b=2&c=3&d&e경우 다음을 반환합니다.

> queryDict
a: "1"
b: "2"
c: "3"
d: undefined
e: undefined

다중 값 키인코딩 된 문자 ?

JavaScript에서 쿼리 문자열 값어떻게 얻을 수 있습니까? 에서 원래 답변을 참조하십시오 .

"?a=1&b=2&c=3&d&e&a=5&a=t%20e%20x%20t&e=http%3A%2F%2Fw3schools.com%2Fmy%20test.asp%3Fname%3Dståle%26car%3Dsaab"
> queryDict
a: ["1", "5", "t e x t"]
b: ["2"]
c: ["3"]
d: [undefined]
e: [undefined, "http://w3schools.com/my test.asp?name=ståle&car=saab"]

8
그것은 한 줄이 아닙니다-여러 줄의 형식이 잘못되었습니다!
JonnyRaa 2014-06-20

1
젠장, 무슨 말을해야할지 모르겠네요 .. 여기에 여러 줄로 된 솔루션이 있습니다.`var queryDict = {}; location.search.substr (1) .split ( "&"). forEach (function (item) {queryDict [item.split ( "=") [0]] = item.split ( "=") [1]; });`
Qwerty

2
하하 사랑 해요! 미안 해요 'X를하는 하나의 라이너를 찾았어요'라고 말하고 줄 바꿈을 뺀 3 줄만 보여 주던 사람과 함께 일하곤 했어요!
JonnyRaa 2014-06-20

@JonnyLeeds 문제 없습니다. 정확히 무슨 뜻인지 알지만, 왜 각 연결 명령을 새 줄에 작성해야합니까? 그런 다음 단일 할당 만있는 매개 변수 (매개 변수는 일반적으로 인라인 됨)로 제공되는 함수가 있습니다. 인라인으로 비명을 지른다! : D
Qwerty

1
@Qwerty, 아마도 당신의 "한 줄짜리"는 가로 스크롤이 필요하지 않도록 다시 포맷되어야하기 때문일 것입니다. 나는 그것을 조정했다.
P i

8

이 게시물을 찾은 후, 내 자신을 보았을 때 가장 찬성표를 얻은 솔루션이 최고라고 생각하지 않는다고 덧붙여 야한다고 생각했습니다. 배열 값을 처리하지 않습니다 (예 :? a = foo & a = bar-이 경우 a가 [ 'foo', 'bar']를 반환 할 것으로 예상합니다). 또한 % 20이 공백을 나타내는 16 진수 문자 인코딩 (예 :? a = Hello % 20World) 또는 공백을 나타내는 데 사용되는 더하기 기호 (예 : :? a = Hello + World).

Node.js는 쿼리 문자열 구문 분석에 대한 매우 완벽한 솔루션을 제공합니다. 꽤 잘 격리되어 있고 허용 라이센스하에 자신의 프로젝트에서 꺼내서 사용하기 쉽습니다.

이에 대한 코드는 다음에서 볼 수 있습니다. https://github.com/joyent/node/blob/master/lib/querystring.js

Node가 가지고있는 테스트는 여기에서 볼 수 있습니다 : https://github.com/joyent/node/blob/master/test/simple/test-querystring.js 나는 인기있는 대답으로 이것들 중 일부를 시도하여 방법을 볼 것을 제안합니다 그들을 처리합니다.

이 기능을 구체적으로 추가하기 위해 참여한 프로젝트도 있습니다. Python 표준 lib 쿼리 문자열 구문 분석 모듈의 포트입니다. 내 포크는 https://github.com/d0ugal/jquery.qeeree 에서 찾을 수 있습니다.


Node, js에서 코드를 빌리는 것만이 아니라 매우 얽혀 있습니다.
alfwatt

5

또는 sugar.js 라이브러리를 사용할 수 있습니다 .

sugarjs.com에서 :

Object.fromQueryString (str , deep = true )

URL의 쿼리 문자열을 개체로 변환합니다. deep이 false 인 경우 변환은 보편적으로 지원되지 않으므로 얕은 매개 변수 만 허용합니다 (즉, [] 구문을 사용하는 객체 또는 배열 없음).

Object.fromQueryString('foo=bar&broken=wear') >{"foo":"bar","broken":"wear"}
Object.fromQueryString('foo[]=1&foo[]=2') >{"foo":[1,2]}

예:

var queryString = Object.fromQueryString(location.search);
var foo = queryString.foo;

3

쿼리 문자열이 있으면 다음을 사용하십시오.

 /**
 * @param qry the querystring
 * @param name name of parameter
 * @returns the parameter specified by name
 * @author eduardo.medeirospereira@gmail.com
 */

function getQueryStringParameter(qry,name){
    if(typeof qry !== undefined && qry !== ""){
        var keyValueArray = qry.split("&");
        for ( var i = 0; i < keyValueArray.length; i++) {
            if(keyValueArray[i].indexOf(name)>-1){
                return keyValueArray[i].split("=")[1];
            }
        }
    }
    return "";
}

2
// How about this
function queryString(qs) {
    var queryStr = qs.substr(1).split("&"),obj={};
    for(var i=0; i < queryStr.length;i++)
        obj[queryStr[i].split("=")[0]] = queryStr[i].split("=")[1];
    return obj;
}

// Usage:
var result = queryString(location.search);

위의 가장 많이 득표 한 답변 의 "업데이트 : 정규식을 사용할 필요 없음"코드와 거의 동일합니다 . 이 질문 에는 비슷한 코드가 많이 있습니다 ). decodeURIComponent적어도 추출 된 문자열 이 누락되었습니다 .
Rup

@Rup,이 답변 후에 업데이트되었습니다.
Qwerty

@Qwerty 아니요. 업데이트는 2013 년 2 월 이었지만이 답변은 거의 1 년 뒤인 2014 년 2 월이었습니다.하지만 누가 신경 쓰는지, 비슷한 코드가 많이 날아가고 있습니다. decodeURIComponent그래도 스탠드 에 대한 내 의견 .
Rup

@Rup 응, 죄송합니다. 그리고 응.
Qwerty

2

John Slegers가 언급 한 라이브러리에는 jQuery 종속성이 있지만 여기에는 vanilla Javascript 버전이 있습니다.

https://github.com/EldonMcGuinness/querystring.js

나는 그의 게시물에 단순히 댓글을 달았을 것이지만 그렇게 할 명성이 부족합니다. : /

예:

아래 예는 불규칙하지만 다음 쿼리 문자열을 처리합니다.

?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 

var qs = "?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";
//var qs = "?=&=";
//var qs = ""

var results = querystring(qs);

(document.getElementById("results")).innerHTML =JSON.stringify(results, null, 2);
<script 
src="https://rawgit.com/EldonMcGuinness/querystring.js/master/dist/querystring.min.js"></script>
<pre id="results">RESULTS: Waiting...</pre>


사실, 나는 ;-) 내 대답에 준 코드에서 jQuery를 종속성을 제거했다
존 Slegers

2

코드

Eldon McGuinness의 This 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;
}

사용 방법

var results = 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");

산출

{
  "foo": ["bar", "boo" ],
  "roo": "bar",
  "bee": "bop",
  "": ["ghost", "ghost2"],
  "checkbox[]": ["b1", "b2"],
  "dd": null,
  "http": [
    "http://w3schools.com/my test.asp?name=ståle&car=saab",
    "http://w3schools2.com/my test.asp?name=ståle&car=saab"
  ]
}

this Fiddle 도 참조하십시오 .


1

function decode(s) {
    try {
        return decodeURIComponent(s).replace(/\r\n|\r|\n/g, "\r\n");
    } catch (e) {
        return "";
    }
}
function getQueryString(win) {
    var qs = win.location.search;
    var multimap = {};
    if (qs.length > 1) {
        qs = qs.substr(1);
        qs.replace(/([^=&]+)=([^&]*)/g, function(match, hfname, hfvalue) {
            var name = decode(hfname);
            var value = decode(hfvalue);
            if (name.length > 0) {
                if (!multimap.hasOwnProperty(name)) {
                    multimap[name] = [];
                }
                multimap[name].push(value);
            }
        });
    }
    return multimap;
}
var keys = getQueryString(window);
for (var i in keys) {
    if (keys.hasOwnProperty(i)) {
        for (var z = 0; z < keys[i].length; ++z) {
            alert(i + ":" + keys[i][z]);
        }
    }
}

hfname 일치에서 대소 문자를 구분하지 않으려면 이름을 .toLowerCase () 할 수도 있습니다.
Shadow2531

값이 비어 있는지 여부를 확인할 수도 있습니다. 그렇다면 항목 추가를 건너 뛰어 배열에 비어 있지 않은 값만 포함되도록 할 수 있습니다.
Shadow2531

1
unescape ()는 UTF-8 시퀀스를 처리하지 않으므로 decodeURIComponent ()를 사용할 수 있습니다. 그러나 + 문자를 공백으로 디코딩하려면 디코딩하기 전에 문자열에서 .replace (/ \ + / g, "")를 실행하십시오.
Shadow2531

1

간단하고 읽기 쉽고 작게 유지하는 것을 좋아합니다.

function searchToObject(search) {
    var pairs = search.substring(1).split("&"),
        obj = {}, pair;

    for (var i in pairs) {
        if (pairs[i] === "") continue;
        pair = pairs[i].split("=");
        obj[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);
    }
    return obj;
}

searchToObject(location.search);

예:

searchToObject('?query=myvalue')['query']; // spits out: 'myvalue'

1

순수한 자바 스크립트 문자열 조작으로 이와 유사한 요구 사항에 대해 작성한 함수

"http://www.google.lk/?Name=John&Age=20&Gender=Male"

function queryize(sampleurl){
    var tokens = url.split('?')[1].split('&');
    var result = {};

    for(var i=0; i<tokens.length; i++){
        result[tokens[i].split('=')[0]] = tokens[i].split('=')[1];
    }

    return result;
}

용법:

queryize(window.location.href)['Name'] //returns John
queryize(window.location.href)['Age'] //returns 20
queryize(window.location.href)['Gender'] //returns Male

깔끔하지만 ?위의 두 답변과 기본적으로 동일한 선행 을 제거하는 방법을 제외하고는 ?
Rup

약간의 개선입니다. 이 방법이 사용되는 방식은 사용자에게 쉽습니다. 사용자는 필요한 쿼리 문자열 값만 알면됩니다.
Pranavan Maru 2014

1

lodash + ES6을 사용하는 경우 다음은 한 줄 솔루션입니다. _.object(window.location.search.replace(/(^\?)/, '').split('&').map(keyVal => keyVal.split('=')));


0

좋아요, 모든 사람들이 제 실제 질문을 무시하고 있기 때문에 저도 제 질문을 게시하겠습니다! 내가 가진 것은 다음과 같습니다.

location.querystring = (function() {

    // The return is a collection of key/value pairs

    var queryStringDictionary = {};

    // Gets the query string, starts with '?'

    var querystring = unescape(location.search);

    // document.location.search is empty if no query string

    if (!querystring) {
        return {};
    }

    // Remove the '?' via substring(1)

    querystring = querystring.substring(1);

    // '&' seperates key/value pairs

    var pairs = querystring.split("&");

    // Load the key/values of the return collection

    for (var i = 0; i < pairs.length; i++) {
        var keyValuePair = pairs[i].split("=");
        queryStringDictionary[keyValuePair[0]] = keyValuePair[1];
    }

    // Return the key/value pairs concatenated

    queryStringDictionary.toString = function() {

        if (queryStringDictionary.length == 0) {
            return "";
        }

        var toString = "?";

        for (var key in queryStringDictionary) {
            toString += key + "=" + queryStringDictionary[key];
        }

        return toString;
    };

    // Return the key/value dictionary

    return queryStringDictionary;
})();

그리고 테스트 :

alert(window.location.querystring.toString());

for (var key in location.querystring) {
    alert(key + "=" + location.querystring[key]);
}

JavaScript는 제 모국어가 아닙니다.

어쨌든 이미 작성된 JavaScript 라이브러리 (예 : jQuery, Prototype)를 찾고 있습니다. :)


1
위의 코드 세 줄에 해당하는 작업을 수행하려면 라이브러리가 정말로 필요하다고 확신하지 않습니다! 그래도 최소한 라이브러리가 키와 값 모두 decodeURIComponent ()를 기억하기를 바랍니다. 지금까지 게시 된 모든 코드 스 니펫은 실패했습니다.
bobince

도서관이 필요하지 않습니다. 내 구현을 라이브러리의 구현과 비교하여 가장자리 케이스가 누락되었는지 확인할 수있었습니다. :)
핵심

자바 스크립트는 당신의 모국어가 아닙니다. 무슨 뜻인지, 도서관이 필요하더라도 배워야합니다
Marwan

0

@CMS의 답변을 바탕으로 다음과 같은 내용이 있습니다 (CoffeeScript에서 JavaScript로 쉽게 변환 할 수 있음).

String::to_query = ->
  [result, re, d] = [{}, /([^&=]+)=([^&]*)/g, decodeURIComponent]
  while match = re.exec(if @.match /^\?/ then @.substring(1) else @)
    result[d(match[1])] = d match[2] 
  result

다음을 사용하여 필요한 것을 쉽게 얻을 수 있습니다.

location.search.to_query()['my_param']

여기서 승리는 객체 지향 인터페이스 (기능적 대신)이며 모든 문자열 (location.search뿐만 아니라)에서 수행 할 수 있습니다.

이미 JavaScript 라이브러리를 사용하고 있다면이 함수는 이미 존재합니다. 예를 들어 여기에 Prototype의 버전이 있습니다.

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