รับพารามิเตอร์ URL ที่หลีกหนี


302

ฉันกำลังมองหาปลั๊กอิน jQuery ที่สามารถรับพารามิเตอร์ URL และสนับสนุนสตริงการค้นหานี้โดยไม่แสดงข้อผิดพลาด JavaScript: "ลำดับ URI ที่ผิดรูปแบบ" หากไม่มีปลั๊กอิน jQuery ที่สนับสนุนสิ่งนี้ฉันต้องรู้วิธีแก้ไขเพื่อสนับสนุนสิ่งนี้

?search=%E6%F8%E5

ค่าของพารามิเตอร์ URL เมื่อถอดรหัสควรเป็น:

æøå

(ตัวละครเป็นภาษานอร์เวย์)

ฉันไม่สามารถเข้าถึงเซิร์ฟเวอร์ดังนั้นฉันจึงไม่สามารถแก้ไขอะไรได้เลย



1
เหตุผลที่คุณจะได้รับ "ในรูปแบบลำดับ URI" decodeURIComponent()เป็นเพราะส่วนใหญ่ของฟังก์ชั่นการใช้งาน อักขระของนอร์เวย์ถูกเข้ารหัสโดยใช้สิ่งที่ชอบที่สุดescape()และเปลี่ยนการdecodeURIComponent()โทรไปเป็นตัวunescape()ช่วย
Kevin M

ดูคำตอบสำหรับโซลูชันที่ทันสมัยของฉัน: stackoverflow.com/a/19992436/64949
Sindre Sorhus

คำตอบ:


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

33
ด้วยname = 'bar'ผมคิดว่า regexp นี้จะตรงและผลตอบแทน'foobar=10' '10'บางทีคุณสามารถเพิ่ม'[?|&]'ที่จุดเริ่มต้นของ regexp ของคุณ ไชโย!
Sébastien RoccaSerra

34
ฟังก์ชันนี้ส่งคืน 'null' แทน null เมื่อไม่ได้กำหนดพารามิเตอร์ ... ความสุขของ js ...
Damien

12
คุณอาจต้องการ "decodeURIComponent ()" แทนที่จะเป็น "decodeURI ()" โดยเฉพาะอย่างยิ่งถ้าคุณส่งข้อมูลที่น่าสนใจเช่น URL กลับมาเป็นพารามิเตอร์ URL
สมบูรณ์แบบ

25
นี่เป็นสิ่งที่ดี แต่ decodeURIComponent นั้นดีกว่าตัวอย่างเช่นฉันมีแฮชแท็ก (% 23) ในพารามิเตอร์ของฉันซึ่งจะถูกละเว้นโดย decodeURI และฉันจะไม่กลับมาเป็นโมฆะ แต่ "" เพราะ decodeURI (null) === "null" ซึ่งเป็นค่าตอบแทนแบบแปลก ๆ "" ดีกว่า; คุณสามารถทำถ้า (! getURLParameter ("param")) แทน if (getURLParameter ("param") === "null") ดังนั้นรุ่นที่ปรับปรุงของฉัน: decodeURIComponent ((RegExp (ชื่อ + '=' + '(. +?) (& | $)')) exec (location.search) || [, ""]) [1])
standup75

3
โหวตลงเนื่องจากสตริงนี้ส่งคืนไม่ว่าผลลัพธ์จะถูกพบหรือไม่และไม่ว่าคุณจะใส่อะไรเป็นอาร์เรย์สำรองเช่น [, null] เนื่องจากผลลัพธ์ถูกห่อไว้ภายใน decodeURI ซึ่งเปลี่ยนทุกสิ่งเป็นสตริง Sanjeev นั้นถูกต้อง แต่รหัสของเขา ไม่ได้ทดสอบอย่างถูกต้องและคัดลอกและวางอย่างง่ายไม่ทำงาน 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
วิธีการเกี่ยวกับการเพิ่มnewในด้านหน้าของ RegExp? คำเตือนผ้าสำลีน้อย
ripper234

18
นี่ควรเป็นคำตอบที่ยอมรับได้ ได้รับจริงกลับมาแทน "null" ดีกว่า
ศิลปะ

11
หากใครต้องการแปลงเป็น coffeescript: getURLParameter: (ชื่อ) -> return decodeURIComponent ((ใหม่ RegExp ("[? | &] # {name} = ([^ &;] +?) (& | ## |; $) "). exec (location.search) || [null," "]) [1] .replace (/ \ + / g, '% 20')) || null;
Redbeard

1
@Redbeard - ฟังก์ชั่นของคุณไม่ควรมีเครื่องหมาย '=' หลังจากนิยามเมธอดแทนที่จะเป็นโคลอนคู่หรือไม่
Zippie

1
นี่เป็นฟังก์ชัน get-URL-parameter รุ่นเดียวที่ใช้ได้กับสตริง UTF8
แน่นอน

107

สิ่งที่คุณต้องการจริงๆเป็นปลั๊กอิน jQuery URL Parser ด้วยปลั๊กอินนี้การรับค่าของพารามิเตอร์ URL เฉพาะ (สำหรับ URL ปัจจุบัน) มีลักษณะดังนี้:

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

หากคุณต้องการให้วัตถุที่มีชื่อพารามิเตอร์เป็นคีย์และค่าพารามิเตอร์เป็นค่าคุณจะเรียกใช้param()โดยไม่มีอาร์กิวเมนต์เช่นนี้

$.url().param();

ห้องสมุดนี้ยังทำงานร่วมกับ 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'

มันมีคุณสมบัติอื่น ๆ เช่นกันตรวจสอบที่หน้าแรกของมันสำหรับเอกสารและตัวอย่างเพิ่มเติม

แทนการเขียน parser URI ของคุณเองสำหรับวัตถุประสงค์เฉพาะที่บอกทำงานในที่สุดกรณีใช้ parser URI ที่เกิดขึ้นจริง โค้ดจากคำตอบอื่น ๆ สามารถส่งคืน'null'แทนnullไม่สามารถใช้กับพารามิเตอร์ที่ว่างเปล่า ( ?foo=&bar=x) ไม่สามารถแยกวิเคราะห์และส่งคืนพารามิเตอร์ทั้งหมดในครั้งเดียวทำงานซ้ำหากคุณค้นหา URL ซ้ำ ๆ เพื่อหาพารามิเตอร์เป็นต้น

ใช้ตัวแยกวิเคราะห์ URI ที่แท้จริงอย่าประดิษฐ์ของคุณเอง

สำหรับผู้ที่เกลียดชัง jQuery มีรุ่นของปลั๊กอินที่ JS


23
คำถามคือ "รับพารามิเตอร์ URL ด้วย jQuery" คำตอบของฉันตอบคำถาม คำตอบอื่น ๆ แนะนำให้ผู้ใช้โดยทั่วไปเขียนตัวแยกวิเคราะห์ URI ของเขาสำหรับกรณีการใช้งานเฉพาะนี้ซึ่งเป็นความคิดที่แย่มาก การแยก URI นั้นซับซ้อนกว่าที่ผู้คนคิด
ลูคัส

2
นี่คือคำตอบที่ฉันกำลังมองหาและเป็น jQuery-ish มากซึ่งแตกต่างจากคำตอบอื่น ๆ
Ehtesh Choudhury

ปลั๊กอินจัดการการเข้ารหัส URI หรือไม่ฉันต้องถอดรหัสด้วยตนเองหรือไม่
Roberto Linares

คำถามที่ว่า "javascript" (ฉันคิดว่ามันหมายถึง 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;
}

การเรียกใช้ getParameters () โดยมี url ที่ต้องการ/posts?date=9/10/11&author=nilbusกลับมา:

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

ฉันจะไม่รวมรหัสที่นี่เพราะมันห่างไกลจากคำถาม แต่ weareon.net โพสต์ห้องสมุดที่อนุญาตการจัดการพารามิเตอร์ใน URL ด้วย:


1
ใช่มันเป็นการดีกว่าที่จะได้รับพารามิเตอร์ทั้งหมด โซลูชันอื่น ๆ ทั้งหมดที่ระบุไว้ที่นี่ทำซ้ำ regex สำหรับแต่ละพารามิเตอร์
เบอร์นาร์ด

ฟังก์ชั่นนี้จะส่งคืนวัตถุที่น่าอึดอัดใจ: {"": undefined}เมื่อ URL ที่จะถือเป็นโมฆะของพารามิเตอร์ ที่ดีที่สุดที่จะกลับวัตถุที่ว่างเปล่าโดยใช้if(searchString=='') return {};โดยตรงหลังจากที่searchStringได้รับมอบหมาย
Jordan Arseno

40

คุณสามารถใช้คุณสมบัติlocation.searchดั้งเดิมของเบราว์เซอร์:

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
นี่คือการทำความสะอาดที่ดีกว่าและสามารถอ่านได้มากกว่า (และอาจไม่มีข้อผิดพลาด) มากกว่า regex หนึ่ง liners ทั้งหมด
Timmmm

8
ฉันจะแนะนำให้ใช้ decodeURIComponent () แทน unescape ()
freedev

+1 สิ่งนี้ใช้ได้กับเบราว์เซอร์รุ่นใหม่ แต่ผู้พัฒนาบางรายจำเป็นต้องทำงานกับ ... : | IE8: S
brunoais

25

ตามคำตอบของ 999 :

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

การเปลี่ยนแปลง:

  • decodeURI() ถูกแทนที่ด้วย decodeURIComponent()
  • [?|&] จะถูกเพิ่มที่จุดเริ่มต้นของ regexp

3
อาจเป็นประโยชน์สำหรับผู้อื่นหากคุณสามารถอธิบายได้ว่าทำไมคุณถึงทำการเปลี่ยนแปลงเหล่านี้ ขอบคุณ
Timm

3
ไม่ได้จัดการ params ?a=&b=1ว่าง: ดีกว่า regexp จะเป็น:"[?&]"+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

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');

ดังนั้นในโค้ดข้างต้น "เทค" จะมี "jQuery" เป็นค่าและตัวแปร "บล็อก" จะเป็น "jquerybyexample"


2

คุณไม่ควรใช้ jQuery สำหรับสิ่งนี้!
วิธีที่ทันสมัยคือการใช้โมดูลขนาดเล็กที่สามารถใช้ซ้ำได้ผ่านตัวจัดการแพคเกจเช่น Bower

ฉันได้สร้างโมดูลเล็ก ๆที่สามารถแยกสตริงการสืบค้นลงในวัตถุ ใช้มันแบบนี้:

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

หากคุณกำลังพูดว่ามันไม่ทันสมัยที่จะมีกรอบมันก็ดี แต่ในกรอบความคิดของฉันมีสถานที่ของพวกเขาจริงๆ jQuery นั้นดูไม่ค่อยน่ารักเท่าไหร่สำหรับฉัน
Lodewijk

0

มีโค้ดบั๊กกี้จำนวนมากที่นี่และโซลูชัน regex ช้ามาก ฉันพบวิธีแก้ปัญหาที่ทำงานได้เร็วกว่า regex มากถึง 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"));

Regex ไม่ใช่โซลูชันแบบ be-all และ end-all สำหรับปัญหาประเภทนี้การจัดการสตริงอย่างง่ายสามารถทำงานได้อย่างมีประสิทธิภาพจำนวนมาก รหัสแหล่งที่มา


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
ระวังเมื่อโพสต์คัดลอกและวาง boilerplate / คำต่อคำตอบสำหรับคำถามหลายข้อเหล่านี้มักจะถูกตั้งค่าสถานะเป็น "สแปม" โดยชุมชน หากคุณทำเช่นนี้ก็มักจะหมายถึงคำถามซ้ำกันดังนั้นให้ตั้งค่าสถานะเป็นเช่นนั้นแทน: stackoverflow.com/a/11808489/419
Kev

-1

ในกรณีที่พวกคุณมี url เหมือน localhost / index.xsp? a = 1 # อะไรบางอย่างและคุณต้องได้รับพารามิเตอร์ไม่ใช่แฮช

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.