Kaçan URL parametresini al


302

URL parametrelerini alabilir ve JavaScript hatası çıktı olmadan bu arama dizesini destekleyen bir jQuery eklentisi arıyorum: "hatalı biçimlendirilmiş URI dizisi". Bunu destekleyen bir jQuery eklentisi yoksa, bunu desteklemek için nasıl değiştirileceğini bilmem gerekir.

?search=%E6%F8%E5

Kod çözüldüğünde URL parametresinin değeri şöyle olmalıdır:

æøå

(karakterler Norveççe'dir).

Sunucuya erişimim yok, bu yüzden üzerinde hiçbir şey değiştiremiyorum.



1
"Hatalı biçimlendirilmiş URI dizisi" almanızın nedeni, işlevlerin çoğunun kullanılmasıdır decodeURIComponent(). Norveçli karakterler büyük olasılıkla benzer bir şey kullanılarak kodlanmış escape()ve decodeURIComponent()çağrıyı değiştirmesi unescape()yardımcı olacaktır.
Kevin M

Modern bir çözüm için cevabımı görün: stackoverflow.com/a/19992436/64949
Sindre Sorhus

Yanıtlar:


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

33
İle name = 'bar', bu normal ifade eşleşecek 'foobar=10've geri döneceğini düşünüyorum '10'. Belki '[?|&]'normal ifadenizin başına ekleyebilirsiniz . Şerefe!
Sébastien RoccaSerra

34
parametre tanımlanmadığında bu işlev null yerine 'null' döndürür ... js sevinci ...
Damien

12
"decodeURI ()" yerine "decodeURIComponent ()" isteyebilirsiniz, özellikle de dönüş URL'leri gibi ilginç verileri bir URL parametresi olarak geçiriyorsanız
perfectionist

25
Bu iyi, ama decodeURIComponent daha iyidir, örneğin benim parametremde decodeURI tarafından göz ardı edilecek bir hashtag (% 23) vardı. Ve null döndürmezdim, ama "", çünkü decodeURI (null) === "null", bu garip bir dönüş değeri, "" daha iyi; if (getURLParameter ("param") === "null") yerine if (! getURLParameter ("param")) yapabilirsiniz. Yani, benim geliştirilmiş sürüm: decodeURIComponent ((RegExp (name + '=' + '(. +?) (& | $)'). Exec (location.search) || [, ""]) [1])
standup75

3
Aşağı, sonuç bulunsa da olmasa da, [[null] gibi alternatif dizi olarak ne koyarsanız döndürün dize olarak oy verdi, çünkü sonuç, bir şeyi dizeye dönüştüren decodeURI içine sarıldı, Sanjeev haklıydı ama kodu doğru test edilmedi ve basit kopyala yapıştır çalışmıyor. function getURLParameter(name) { var p = RegExp(name + '=' + '(.+?)(&|$)').exec(location.search); if(!!p) { p = decodeURI(p[1]); } return p; }
Lukasz 'Severiaan' Grela

295

Aşağıda, buradaki yorumlardan oluşturduğum yanı sıra belirtilmeyen hataları (aslında null döndürme ve 'null' değil) düzeltme:

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

6
newRegExp'in önüne eklemeye ne dersiniz ? Daha az tiftik uyarısı.
ripper234

18
Bu kabul edilen cevap olmalı. "Null" yerine gerçek null değerini geri almak çok daha iyidir.
Sanat

11
Herkes buna coffeescript dönüştürülmüş gerekiyorsa: getURLParameter: (name) -> dönüş decodeURIComponent ((yeni RegExp ("[? | &] # {Name} = ([^ &;] +?) (& | ## |; | $) "). exec (location.search) || [null," "]) [1] .replace (/ \ + / g, '% 20')) || null;
Redbeard

1
@Redbeard - İşlevinizde, çift nokta yerine yöntem tanımından sonra '=' işareti olmamalı mı?
Zippie

1
Bu, UTF8 dizesiyle benim için çalışan bir get-URL parametresi işlevinin tek sürümüdür.
certainlyakey

107

Gerçekten istediğiniz jQuery URL Ayrıştırıcı eklentisidir . Bu eklenti ile belirli bir URL parametresinin değerini (geçerli URL için) almak şöyle görünür:

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

Anahtar olarak parametre adlarına ve değer olarak parametre değerlerine sahip bir nesne istiyorsanız param(), aşağıdaki gibi bağımsız değişken olmadan çağrı yaparsınız :

$.url().param();

Bu kütüphane, yalnızca geçerli olanla değil, diğer URL'lerle de çalışır:

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

Bu, URL ayrıştırma kütüphanesinin tamamı olduğundan, belirtilen bağlantı noktası veya yol, protokol vb. Gibi URL'den de başka bilgiler alabilirsiniz:

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'

Başka özellikleri de var, daha fazla doküman ve örnek için ana sayfasına bakın.

Bunun yerine bu özel amaç için kendi URI ayrıştırıcı yazma tür çalışır çoğu durumlarda, gerçek bir URI çözümleyici kullanabilirsiniz. Cevaba bağlı olarak, diğer cevaplardan gelen kodlar 'null'yerine dönebilir null, boş parametrelerle ( ?foo=&bar=x) çalışmaz, tüm parametreleri bir kerede ayrıştıramaz ve geri döndüremez, URL'yi parametreler için tekrar tekrar sorgularsanız, işi tekrarlar.

Gerçek bir URI ayrıştırıcısı kullanın, kendinizinkini icat etmeyin.

JQuery'den farklı olanlar için , eklentinin saf JS sürümü var .


23
Soru "URL parametresini jQuery ile al" sorusudur. Cevabım soruyu cevaplıyor. Diğer cevaplar, kullanıcıya bu özel kullanım durumu için kendi URI ayrıştırıcısını yazmasını söyler, bu da korkunç bir fikirdir. URI'leri ayrıştırmak insanların düşündüğü kadar karmaşıktır.
Lucas

2
Aradığım cevap bu ve diğer cevapların aksine çok jQuery-ish.
Ehtesh Choudhury

Eklenti URI kodlamasını ele alıyor mu veya manuel olarak kodunu çözmem gerekiyor mu?
Roberto Linares

Soru "javascript" (doğrudan DOM anlamına gelir sanırım) veya jQuery diyor. Yani diğerleri yapacak.
brunoais

43

URL parametrelerinin ne olacağını bilmiyorsanız ve parametrelerde bulunan anahtarlar ve değerlerle bir nesne almak istiyorsanız, bunu kullanabilirsiniz:

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'si ile getParameters () çağrıldığında /posts?date=9/10/11&author=nilbus:

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

Ben bile sorudan daha uzak olduğu için kodu buraya dahil olmaz, ama weareon.net URL de parametrelerin manipülasyonu sağlayan bir kütüphane yayınladı:


1
Evet, tüm parametreleri elde etmek daha iyidir. Burada listelenen diğer tüm çözümler, her bir param için normal ifadeyi tekrarlar.
Bernard

Bu işlev garip bir nesne döndürür: {"": undefined}URL parametrelerden yoksun olduğunda. Atamadan if(searchString=='') return {};hemen sonra boş bir nesneyi döndürmek en searchStringiyisidir.
Jordan Arseno

40

Tarayıcının yerel location.search özelliğini kullanabilirsiniz:

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;
}

Ancak size yardımcı olabilecek bazı jQuery eklentileri vardır:


4
Bu, tüm normal regex tek katmanlardan daha temiz ve daha okunabilir (ve muhtemelen daha fazla hata içermez).
Timmmm

8
Ben unescape () yerine decodeURIComponent () kullanmanızı öneririm
freedev

+1 bu modern tarayıcılar için çalışır, ancak bazı geliştiriciler ile çalışmak gerekir ...: | IE8: S.
brunoais

25

999'un cevabına dayanarak :

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

değişiklikler:

  • decodeURI() ile değiştirildi decodeURIComponent()
  • [?|&] normal ifadenin başına eklenir

3
Bu değişiklikleri neden yaptığınızı açıklayabiliyorsanız başkaları için yararlı olabilir. Teşekkürler
Timm

3
Boş params işlemek yok: ?a=&b=1. Daha iyi normal ifade:"[?&]"+name+"=([^&]*)"
serg

6

Büyük / küçük harfe duyarlı olmamak için i parametresini eklemeniz gerekir:

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

3

Tüm cevapları okuduktan sonra parametreleri versiyon olarak kullanmak için + ikinci bir fonksiyon ile bu versiyona ulaştım.

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
İyi cevap, ancak sadece bir uyarı. JSHint'e göre, [, ""] eski tarayıcılarda sorunlara neden olabilir. Bu nedenle, bunun yerine [null, ""] veya [undefined, ""] kullanın. IE8'i destekleyen ve IE7 demeye cesaret eden bazılarımız hala mutsuz.
Delicia Brummitt

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

$.urlParam("key");

2

Örneğin, herhangi bir parametre değişkeninin değerini döndüren bir işlev.

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'nin bu olduğunu varsayarak, bu işlevi bu şekilde kullanabilirsiniz,

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

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

Yani yukarıdaki kod değişkeni "tech" değeri "jQuery" olacak ve "blog" değişkeni "jquerybyexample" olacaktır.


2

Böyle bir şey için jQuery kullanmamalısınız!
Modern yol, Bower gibi bir paket yöneticisi aracılığıyla küçük yeniden kullanılabilir modüller kullanmaktır.

Sorgu dizesini bir nesneye ayrıştırabilen küçük bir modül oluşturdum . Şöyle kullanın:

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

Bir çerçeveye sahip olmanın modern olmadığını söylüyorsanız, sorun değil. Ama bence çerçevelerin gerçekten yeri var. jQuery bana giderek daha az hoş görünüyor.
Lodewijk

0

Burada çok fazla hata kodu var ve regex çözümleri çok yavaş. Normal ifadeye göre 20 kata kadar daha hızlı çalışan ve zarif bir şekilde basit bir çözüm buldum:

    /*
    *   @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"));

Regex her şeyden önce ve her şeyden önce bir çözüm değildir, bu tür bir sorun için basit dize manipülasyonu çok daha verimli çalışabilir. Kod kaynağı .


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

</script>

getURLParameter(id)veya getURLParameter(Id)aynı şekilde çalışır :)


0

URL'de depolanan dinamik değişkenleri parametre olarak almak ve komut dosyalarınızla kullanıma hazır JavaScript değişkenleri olarak saklamak için jQuery kod snippet'i:

$.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

Bunun gibi bir URL'den JavaScript'te URL parametresi almak için basit bir işlev oluşturdum:

.....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");

ÇIKTI: 18


2
Birden fazla soruya kopyala ve yapıştır levhası / kelimesi kelimesine yanıtlar gönderirken dikkatli olun, bunlar topluluk tarafından "spam" olarak işaretlenir. Bunu yapıyorsanız, bu genellikle soruların kopyaları olduğu anlamına gelir, bu yüzden onları şu şekilde işaretleyin: stackoverflow.com/a/11808489/419
Kev

-1

Herhalde localhost / index.xsp? A = 1 # gibi bir URL'ye sahip olmanız ve paraşmayı değil karma almanız gerekir.

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

Diğer parametre adlarının bir parçası olabilecek parametre adlarını düzgün işlemeyeceğinden @pauloppenheim tarafından yanıtta hafif bir değişiklik yapıldı.

Örneğin: "appenv" ve "env" parametreleriniz varsa, "env" değerinin yeniden ayarlanması "appenv" değerini alabilir.

Düzeltme:

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

-2

Bu yardımcı olabilir.

<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
Bu kod iyi test edilmemiştir. Sorgulama ile ne olacağını tahmin et?twothrids=text
Lyth
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.