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


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.