이스케이프 된 URL 매개 변수 가져 오기


302

URL 매개 변수를 가져올 수 있고 JavaScript 오류 "malformed URI sequence"를 출력하지 않고이 검색 문자열을 지원하는 jQuery 플러그인을 찾고 있습니다. 이를 지원하는 jQuery 플러그인이 없으면이를 지원하도록 수정하는 방법을 알아야합니다.

?search=%E6%F8%E5

디코딩 될 때 URL 매개 변수의 값은 다음과 같아야합니다.

æøå

(문자는 노르웨이어입니다).

서버에 액세스 할 수 없으므로 서버에서 아무것도 수정할 수 없습니다.



1
"잘못된 URI 시퀀스"를 얻는 이유는 대부분의 함수가를 사용하기 때문 decodeURIComponent()입니다. 노르웨이어 문자는 호출을 도움으로 escape()변경하는 것과 같은 것을 사용하여 인코딩되었을 가능성이 높습니다 . decodeURIComponent()unescape()
Kevin M

: 현대 솔루션에 대한 내 대답을 참조하십시오 stackoverflow.com/a/19992436/64949
Sindre Sorhus

답변:


417
function getURLParameter(name) {
    return decodeURI(
        (RegExp(name + '=' + '(.+?)(&|$)').exec(location.search)||[,null])[1]
    );
}

33
와 함께 name = 'bar', 나는이 정규 표현식이 일치 'foobar=10'하고 돌아올 것이라고 생각합니다 '10'. '[?|&]'정규 표현식의 시작 부분에 추가 할 수 있습니다 . 건배!
Sébastien RoccaSerra

34
이 함수는 매개 변수가 정의되지 않은 경우 null 대신 'null'을 반환합니다 ... js의 기쁨 ...
Damien

12
특히 URL 매개 변수로 리턴 URL과 같은 흥미로운 데이터를 전달하는 경우 "decodeURI ()"대신 "decodeURIComponent ()"를 원할 수 있습니다.
완벽 주의자

25
이것은 좋지만, decodeURIComponent가 더 좋습니다. 예를 들어, 해독 매개 변수에 해시 태그 (% 23)가있어 decodeURI에 의해 무시됩니다. 그리고 나는 null이 아니라 ""를 반환 할 것이다. 왜냐하면 decodeURI (null) === "null"은 이상한 반환 값이기 때문에 ""가 더 좋다. if (getURLParameter ( "param") === "null") 대신 if (! getURLParameter ( "param"))를 수행 할 수 있습니다. 따라서 개선 된 버전 : decodeURIComponent ((RegExp (name + '='+ '(. +?) (& | $)'). exec (location.search) || [, ""]) [1])
standup75

3
결과가 발견되었는지 여부에 관계없이 문자열을 반환하고 투표 결과를 문자열로 변환 한 decodeURI로 래핑했기 때문에 대체 배열 예를 들어 [, null]과 상관없이 문자열이 반환됩니다. 올바르게 테스트되지 않았으며 간단한 복사 및 붙여 넣기가 작동하지 않습니다. function getURLParameter(name) { var p = RegExp(name + '=' + '(.+?)(&|$)').exec(location.search); if(!!p) { p = decodeURI(p[1]); } return p; }
Lukasz 'Severiaan'Grela

295

아래는 내가 언급하지 않은 버그 수정 (예 : 실제로 null을 반환하고 'null'이 아닌)을 수정하는 것입니다.

function getURLParameter(name) {
    return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.search)||[,""])[1].replace(/\+/g, '%20'))||null;
}

6
newRegExp 앞에 추가하는 것은 어떻습니까? 보풀이 적은 경고.
ripper234

18
이것은 정답입니다. "null"대신 실제 널을 다시 얻는 것이 더 좋습니다.
Art

11
누군가 이것을 coffeescript로 변환해야하는 경우 : getURLParameter : (name)-> return decodeURIComponent ((new RegExp ( "[? | &] # {name} = ([^ &;] +?) (& | ## |; | $) "). exec (location.search) || [null," "]) [1] .replace (/ \ + / g, '% 20')) || null;
Redbeard September

1
@ Redbeard-함수가 이중 콜론 대신 메소드 정의 후에 '='기호를 가져서는 안됩니까?
Zippie

1
이것은 UTF8 문자열로 작동하는 get-URL-parameter 함수의 유일한 버전입니다.
확실히

107

정말로 원하는 것은 jQuery URL Parser plugin 입니다. 이 플러그인을 사용하면 특정 URL 매개 변수 (현재 URL에 대한) 값을 얻는 방법은 다음과 같습니다.

$.url().param('foo');

매개 변수 이름을 키로 사용하고 매개 변수 값을 값으로 사용하는 객체를 원하는 경우 다음 param()과 같이 인수없이 호출 하면됩니다.

$.url().param();

이 라이브러리는 현재 URL뿐만 아니라 다른 URL 과도 작동합니다.

$.url('http://allmarkedup.com?sky=blue&grass=green').param();
$('#myElement').url().param(); // works with elements that have 'src', 'href' or 'action' attributes

이것은 전체 URL 구문 분석 라이브러리이므로 지정된 포트 또는 경로, 프로토콜 등과 같은 URL에서 다른 정보를 얻을 수도 있습니다.

var url = $.url('http://allmarkedup.com/folder/dir/index.html?item=value');
url.attr('protocol'); // returns 'http'
url.attr('path'); // returns '/folder/dir/index.html'

다른 기능도 있습니다 . 더 많은 문서와 예제 는 홈페이지 를 확인하십시오 .

대신이 특정 목적을 위해 자신의 URI 파서 쓰는 작동 대부분의 경우를 실제 URI 파서를 사용합니다. 답변에 따라 다른 답변의 코드는 'null'대신 대신 반환 할 수 null있으며 빈 매개 변수 ( ?foo=&bar=x) 로는 작동하지 않으며 한 번에 모든 매개 변수를 구문 분석하고 반환 할 수 없으며 매개 변수에 대한 URL을 반복적으로 쿼리하면 작업을 반복합니다.

실제 URI 파서를 사용하십시오.

jQuery를 싫어하는 사람들에게는 순수한 JS 플러그인 버전이 있습니다.


23
문제는 "jQuery와 함께 URL 매개 변수를 얻는 것"입니다. 내 대답은 질문에 대답합니다. 다른 답변은 사용자에게 기본적 으로이 특정 사용 사례에 대한 자신의 URI 파서를 작성하도록 지시합니다. 이는 끔찍한 아이디어입니다. 사람들이 생각하는 URI 구문 분석은 더 복잡합니다.
Lucas

2
이것은 내가 찾고있는 답변이며 다른 답변과 달리 매우 jQuery-ish입니다.
Ehtesh Choudhury

플러그인이 URI 인코딩을 처리합니까, 아니면 수동으로 디코딩해야합니까?
Roberto Linares 16:16에

질문은 "자바 스크립트"(DOM을 직접 의미한다고 생각합니다) 또는 jQuery입니다. 다른 사람들도 그렇게 할 것입니다.
brunoais

43

URL 매개 변수가 무엇인지 모르고 매개 변수에있는 키와 값이있는 오브젝트를 얻으려면 다음을 사용할 수 있습니다.

function getParameters() {
  var searchString = window.location.search.substring(1),
      params = searchString.split("&"),
      hash = {};

  if (searchString == "") return {};
  for (var i = 0; i < params.length; i++) {
    var val = params[i].split("=");
    hash[unescape(val[0])] = unescape(val[1]);
  }
  return hash;
}

URL과 함께 getParameters ()를 호출하면 다음과 같이 /posts?date=9/10/11&author=nilbus반환됩니다.

{
  date:   '9/10/11',
  author: 'nilbus'
}

질문과는 거리가 멀기 때문에 여기에 코드를 포함 시키지는 않지만 weareon.net은 URL의 매개 변수를 조작 할 수있는 라이브러리를 게시했습니다.


1
예, 이것은 모든 매개 변수를 얻는 것이 좋습니다. 여기에 나열된 다른 모든 솔루션은 각 매개 변수에 대한 정규식을 반복합니다.
Bernard

이 함수는 {"": undefined}URL에 매개 변수가없는 경우 어색한 개체를 반환합니다 . 할당 if(searchString=='') return {};후 바로 사용하여 빈 객체를 반환하는 것이 가장 searchString좋습니다.
Jordan Arseno

40

브라우저 기본 위치를 사용할 수 있습니다 .

function getParameter(paramName) {
  var searchString = window.location.search.substring(1),
      i, val, params = searchString.split("&");

  for (i=0;i<params.length;i++) {
    val = params[i].split("=");
    if (val[0] == paramName) {
      return unescape(val[1]);
    }
  }
  return null;
}

그러나 당신을 도울 수있는 몇 가지 jQuery 플러그인이 있습니다.


4
이것은 모든 정규식 1 라이너보다 훨씬 깨끗하고 읽기 쉽습니다 (그리고 아마도 더 버그가없는 것입니다).
Timmmm

8
unescape () 대신 decodeURIComponent ()를 사용하는 것이 좋습니다
freedev

+1 이것은 최신 브라우저에서 작동하지만 일부 개발자는 다음 작업을 수행해야합니다 ... : | IE8 : S.
brunoais

25

999의 답변을 바탕으로 :

function getURLParameter(name) {
    return decodeURIComponent(
        (location.search.match(RegExp("[?|&]"+name+'=(.+?)(&|$)'))||[,null])[1]
    );  
}

변경 사항 :

  • decodeURI() 로 대체 decodeURIComponent()
  • [?|&] 정규 표현식의 시작 부분에 추가됩니다

3
왜 이러한 변경을했는지 설명 할 수 있다면 다른 사람들에게 도움이 될 수 있습니다. Thx
Timm

3
빈 매개 변수를 처리하지 않습니다 ?a=&b=1. 더 나은 정규 표현식은 다음과 같습니다."[?&]"+name+"=([^&]*)"
serg

6

대소 문자를 구분하지 않으려면 i 매개 변수를 추가해야합니다.

  function getURLParameter(name) {
    return decodeURIComponent(
      (RegExp(name + '=' + '(.+?)(&|$)', 'i').exec(location.search) || [, ""])[1]
    );
  }

3

모든 답변을 읽은 후 매개 변수를 플래그로 사용하는 두 번째 함수 +이 버전으로 끝났습니다.

function getURLParameter(name) {
    return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)','i').exec(location.search)||[,""])[1].replace(/\+/g, '%20'))||null;
}

function isSetURLParameter(name) {
    return (new RegExp('[?|&]' + name + '(?:[=|&|#|;|]|$)','i').exec(location.search) !== null)
}

2
좋은 답변이지만 단 하나의 경고입니다. JSHint 당 [, ""]은 이전 브라우저에서 문제를 일으킬 수 있습니다. 대신 [null, ""] 또는 [undefined, ""]를 사용하십시오. IE8을 지원하고 IE7이라고 감히 감히하는 불행한 사람들이 여전히 있습니다.
Delicia Brummitt 2016 년

2
$.urlParam = function(name){
  var results = new RegExp('[\\?&]' + name + '=([^&#]*)').exec(top.window.location.href); 
  return (results !== null) ? results[1] : 0;
}

$.urlParam("key");

2

예를 들어, 매개 변수 변수의 값을 반환하는 함수입니다.

function GetURLParameter(sParam)
{
    var sPageURL = window.location.search.substring(1);
    var sURLVariables = sPageURL.split('&');
    for (var i = 0; i < sURLVariables.length; i++)
    {
        var sParameterName = sURLVariables[i].split('=');
        if (sParameterName[0] == sParam)
        {
            return sParameterName[1];
        }
    }
}​

URL이 다음과 같다고 가정하면이 기능을 사용할 수 있습니다.

"http://example.com/?technology=jquery&blog=jquerybyexample".

var tech = GetURLParameter('technology');
var blog = GetURLParameter('blog');

위의 코드에서 변수 "tech"는 "jQuery"를 값으로 가지며 "blog"변수는 "jquerybyexample"이됩니다.


2

이런 식으로 jQuery를 사용해서는 안됩니다!
현대적인 방법은 Bower와 같은 패키지 관리자를 통해 재사용 가능한 작은 모듈을 사용하는 것입니다.

쿼리 문자열을 객체로 구문 분석 할 수 있는 작은 모듈 을 만들었습니다 . 다음과 같이 사용하십시오.

// parse the query string into an object and get the property
queryString.parse(unescape(location.search)).search;
//=> æøå

프레임 워크를 사용하는 것이 현대적이지 않다고 말하면 괜찮습니다. 그러나 내 의견으로는 프레임 워크가 실제로 자리 잡고 있습니다. jQuery는 점점 나에게 예쁘지 않습니다.
Lodewijk

0

여기에 버그가 많은 코드가 있으며 정규식 솔루션은 매우 느립니다. 정규식보다 최대 20 배 빠르게 작동하며 우아하게 간단한 솔루션을 찾았습니다.

    /*
    *   @param      string      parameter to return the value of.
    *   @return     string      value of chosen parameter, if found.
    */
    function get_param(return_this)
    {
        return_this = return_this.replace(/\?/ig, "").replace(/=/ig, ""); // Globally replace illegal chars.

        var url = window.location.href;                                   // Get the URL.
        var parameters = url.substring(url.indexOf("?") + 1).split("&");  // Split by "param=value".
        var params = [];                                                  // Array to store individual values.

        for(var i = 0; i < parameters.length; i++)
            if(parameters[i].search(return_this + "=") != -1)
                return parameters[i].substring(parameters[i].indexOf("=") + 1).split("+");

        return "Parameter not found";
    }

console.log(get_param("parameterName"));

정규식은 전부가 아니라 최후의 해결책이 아닙니다. 이러한 유형의 문제 때문에 간단한 문자열 조작이 훨씬 효율적으로 작동 할 수 있습니다. 코드 소스 .


0
<script type="text/javascript">
function getURLParameter(name) {
        return decodeURIComponent(
            (location.search.toLowerCase().match(RegExp("[?|&]" + name + '=(.+?)(&|$)')) || [, null])[1]
        );
    }

</script>

getURLParameter(id)또는 getURLParameter(Id)동일하게 작동합니다 :)


0

jQuery 코드 스 니펫은 URL에 저장된 동적 변수를 매개 변수로 가져 와서 스크립트와 함께 사용할 수있는 JavaScript 변수로 저장합니다.

$.urlParam = function(name){
    var results = new RegExp('[\?&]' + name + '=([^&#]*)').exec(window.location.href);
    if (results==null){
       return null;
    }
    else{
       return results[1] || 0;
    }
}

example.com?param1=name&param2=&id=6

$.urlParam('param1'); // name
$.urlParam('id');        // 6
$.urlParam('param2');   // null

//example params with spaces
http://www.jquery4u.com?city=Gold Coast
console.log($.urlParam('city'));  
//output: Gold%20Coast

console.log(decodeURIComponent($.urlParam('city'))); 
//output: Gold Coast

-1
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("Param:"+arrParamValues[i]);
                return arrParamValues[i];
             }
       }
       return "No Parameters Found";
    }

}

-1

다음과 같은 URL에서 JavaScript의 URL 매개 변수를 얻는 간단한 함수를 만들었습니다.

.....58e/web/viewer.html?page=*17*&getinfo=33


function buildLinkb(param) {
    var val = document.URL;
    var url = val.substr(val.indexOf(param))  
    var n=parseInt(url.replace(param+"=",""));
    alert(n+1); 
}
buildLinkb("page");

산출: 18


2
여러 질문에 대한 복사 및 붙여 넣기 상용구 / 언어 답변을 게시 할 때 커뮤니티에서 '스팸 (spammy)'으로 표시되는 경향이 있습니다. 이 작업을 수행하는 경우 일반적으로 질문이 중복됨을 의미하므로 대신 다음과 같이 플래그를 지정하십시오. stackoverflow.com/a/11808489/419
Kev

-1

localhost / index.xsp? a = 1 # something과 같은 URL이 있고 해시가 아닌 매개 변수를 가져와야하는 경우를 대비하여.

var vars = [], hash, anchor;
var q = document.URL.split('?')[1];
if(q != undefined){
    q = q.split('&');
    for(var i = 0; i < q.length; i++){
        hash = q[i].split('=');
        anchor = hash[1].split('#');
        vars.push(anchor[0]);
        vars[hash[0]] = anchor[0];
    }
}

-1

다른 매개 변수 이름의 일부일 수있는 매개 변수 이름을 제대로 처리하지 못하기 때문에 @pauloppenheim의 답변을 약간 수정했습니다.

예 : "appenv"및 "env"매개 변수가있는 경우 "env"값을 다시 사용하면 "appenv"값을 가져올 수 있습니다.

고치다:

var urlParamVal = function (name) {
    var result = RegExp("(&|\\?)" + name + "=(.+?)(&|$)").exec(location.search);
    return result ? decodeURIComponent(result[2]) : "";
};

-2

도움이 될 수 있습니다.

<script type="text/javascript">
    $(document).ready(function(){
        alert(getParameterByName("third"));
    });
    function getParameterByName(name){
        var url     = document.URL,
            count   = url.indexOf(name);
            sub     = url.substring(count);
            amper   = sub.indexOf("&"); 

        if(amper == "-1"){
            var param = sub.split("=");
            return param[1];
        }else{
            var param = sub.substr(0,amper).split("=");
            return param[1];
        }

    }
</script>

1
이 코드는 제대로 테스트되지 않았습니다. 쿼리에서 발생하는 일을 추측?twothrids=text
Lyth
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.