จะรับค่าจากพารามิเตอร์ GET ได้อย่างไร


1327

ฉันมี URL ที่มีพารามิเตอร์ GET บางตัวดังนี้:

www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5 

cฉันต้องการที่จะได้รับค่าทั้งหมดของ ผมพยายามที่จะอ่าน URL m2แต่ฉันมีเพียง ฉันจะทำสิ่งนี้โดยใช้ JavaScript ได้อย่างไร


ก่อนที่คุณจะโพสต์คำตอบใหม่พิจารณาว่ามีคำตอบสำหรับคำถามนี้มากกว่า 50 คำ กรุณาตรวจสอบให้แน่ใจว่าคำตอบของคุณก่อให้เกิดข้อมูลที่ไม่ใช่คำตอบที่มีอยู่
janniks

คำตอบ:


1998

JavaScript นั้นไม่มีอะไรในตัวสำหรับการจัดการพารามิเตอร์สตริงการสืบค้น

รหัสที่ใช้ในเบราว์เซอร์ (ทันสมัย) คุณสามารถใช้URLวัตถุ (ซึ่งเป็นส่วนหนึ่งของ API ที่เบราว์เซอร์ให้กับ JS):

var url_string = "http://www.example.com/t.html?a=1&b=3&c=m2-m3-m4-m5"; //window.location.href
var url = new URL(url_string);
var c = url.searchParams.get("c");
console.log(c);


สำหรับเบราว์เซอร์รุ่นเก่า (รวมถึง Internet Explorer) คุณสามารถใช้polyfill นี้หรือรหัสจากคำตอบเดิมของรุ่นนี้ที่มีมาก่อนURL:

คุณสามารถเข้าถึงlocation.searchได้ซึ่งจะให้?ตัวละครจากคุณไปจนถึงท้าย URL หรือจุดเริ่มต้นของตัวระบุชิ้นส่วน (#foo) แล้วแต่ว่าจะถึงอย่างใดก่อน

จากนั้นคุณสามารถวิเคราะห์ด้วย:

function parse_query_string(query) {
  var vars = query.split("&");
  var query_string = {};
  for (var i = 0; i < vars.length; i++) {
    var pair = vars[i].split("=");
    var key = decodeURIComponent(pair[0]);
    var value = decodeURIComponent(pair[1]);
    // If first entry with this name
    if (typeof query_string[key] === "undefined") {
      query_string[key] = decodeURIComponent(value);
      // If second entry with this name
    } else if (typeof query_string[key] === "string") {
      var arr = [query_string[key], decodeURIComponent(value)];
      query_string[key] = arr;
      // If third or later entry with this name
    } else {
      query_string[key].push(decodeURIComponent(value));
    }
  }
  return query_string;
}

var query_string = "a=1&b=3&c=m2-m3-m4-m5";
var parsed_qs = parse_query_string(query_string);
console.log(parsed_qs.c);

คุณสามารถรับสตริงการสืบค้นจาก URL ของหน้าปัจจุบันด้วย:

var query = window.location.search.substring(1);
var qs = parse_query_string(query);

เบราว์เซอร์รุ่นเก่าที่คุณอาจต้องpolyfill สำหรับURLURLSearchParamsนอกเหนือไปจากหนึ่งสำหรับ หรือคุณสามารถหลบปัญหานี้โดยการเปลี่ยนสายในคำตอบข้างต้นด้วยvar c = url.searchParams.get("c"); var c = new URLSearchParams(window.location.search).get("c");
evanrmurphy

parse_query_string จะล้มเหลวสำหรับค่าที่มี '=' เช่นเมื่อส่งค่าการเข้ารหัส base64 เป็นค่า รุ่นที่ใช้การแสดงผลปกติด้านล่างจะทำงานได้ดีขึ้น
Manel Clos

7
@Jamland - อย่าทำอย่างนั้น มันจะทำลายสิ่งต่าง ๆ นี่คือตัวอย่างสดที่ new URL()คาดว่าจะได้รับ URL ที่เข้ารหัสอย่างถูกต้องเป็นอาร์กิวเมนต์ decodeURIComponentคาดว่าจะถูกส่งผ่านส่วนประกอบของ URL ไม่ใช่ URL ทั้งหมด
Quentin

@Quentin ฉันได้ตรวจสอบตัวอักษรพิเศษต่าง ๆ และฉันเห็นว่าคุณพูดถูก decodeURIComponentไม่ควรใช้ในกรณีนี้
Jamland

1
ฟังก์ชั่นไม่ได้สองครั้งของการถอดรหัสparse_query_string ออกกล่าวโดย @ManelClos สามารถ addressed โดยการเพิ่มพารามิเตอร์ที่สอง( ) เพื่อ value=2limitvars[i].split()
Jake

242

การใช้งานส่วนใหญ่ที่ฉันเคยเห็นพลาดการถอดรหัส URL ชื่อและค่า

นี่คือฟังก์ชั่นยูทิลิตี้ทั่วไปที่จะทำการถอดรหัส URL ที่เหมาะสม:

function getQueryParams(qs) {
    qs = qs.split('+').join(' ');

    var params = {},
        tokens,
        re = /[?&]?([^=]+)=([^&]*)/g;

    while (tokens = re.exec(qs)) {
        params[decodeURIComponent(tokens[1])] = decodeURIComponent(tokens[2]);
    }

    return params;
}

//var query = getQueryParams(document.location.search);
//alert(query.foo);

3
รหัสนี้ใช้ไม่ได้ มันสร้างวนลูปไม่สิ้นสุดเพราะ regex รวบรวมในนิยามวงซึ่งรีเซ็ตดัชนีปัจจุบัน มันทำงานได้อย่างถูกต้องหากคุณใส่ regex ลงในตัวแปรภายนอกลูป
maxhawkins

2
@maxhawkins: มันทำงานได้ในเบราว์เซอร์บางตัวในขณะที่มันจะเข้าไปวนรอบไม่สิ้นสุดในคนอื่น คุณคิดถูกครึ่งนึงแล้ว ฉันจะแก้ไขรหัสให้เป็นเบราว์เซอร์ข้าม ขอบคุณสำหรับการชี้ให้เห็น!
Ates Goral

3
@ZiTAL ฟังก์ชั่นนี้จะใช้กับส่วนแบบสอบถามของ URL ไม่ใช่ URL ทั้งหมด ดูตัวอย่างการใช้ความเห็นด้านล่าง
Ates Goral

1
@Harvey Case insensitivity ไม่ได้เกี่ยวข้องกับพารามิเตอร์การสืบค้น ดูเหมือนสิ่งเฉพาะแอปพลิเคชันที่ควรใช้พร้อมกับหรือด้านบนของการแยกพารามิเตอร์แบบสอบถาม
Ates Goral

7
ทำไมqs.split('+').join(' ');ไม่qs.replace(/\+/g, ' ');?
FlameStorm

234

แหล่ง

function gup( name, url ) {
    if (!url) url = location.href;
    name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
    var regexS = "[\\?&]"+name+"=([^&#]*)";
    var regex = new RegExp( regexS );
    var results = regex.exec( url );
    return results == null ? null : results[1];
}
gup('q', 'hxxp://example.com/?q=abc')

8
ฉันชอบตัวเลือกนี้ที่ดีที่สุด แต่ชอบคืนค่า Null หรือผลลัพธ์ แต่ไม่ใช่สตริงว่าง
Jason Thrasher

1
ดูเหมือนว่าคุณจะมีตัวอักษรพิเศษเพิ่มเติม "\\[" ควรจะเป็น "\[". เนื่องจากเป็นสตริงปกติ [และ] จึงไม่จำเป็นต้องหลบหนี
EricP

นี่ไม่ใช่กรณีตาย ฉันจะเพิ่ม "i" เพื่อทำให้ตัวพิมพ์เล็กและใหญ่ไม่ได้ตรงไหน
ซีตา

การแจ้งเตือน (gup ('UserID', window.location.href));
Arun Prasad ES

6
@mottie dead link
Invot

202

นี่เป็นวิธีที่ง่ายในการตรวจสอบเพียงพารามิเตอร์เดียว:

URL ตัวอย่าง:

    http://myserver/action?myParam=2

ตัวอย่าง Javascript:

    var myParam = location.search.split('myParam=')[1]

หาก "myParam" มีอยู่ใน URL ... ตัวแปร myParam จะมี "2" มิฉะนั้นจะไม่ถูกกำหนด

บางทีคุณอาจต้องการค่าเริ่มต้นในกรณีนี้:

    var myParam = location.search.split('myParam=')[1] ? location.search.split('myParam=')[1] : 'myDefaultValue';

อัปเดต: ใช้งานได้ดีกว่า:

    var url = "http://www.example.com/index.php?myParam=384&login=admin"; // or window.location.href for current url
    var captured = /myParam=([^&]+)/.exec(url)[1]; // Value is in [1] ('384' in our case)
    var result = captured ? captured : 'myDefaultValue';

และใช้งานได้แม้ในขณะที่ URL เต็มไปด้วยพารามิเตอร์


36
ใช้งานได้เฉพาะเมื่อพารามิเตอร์ที่คุณกำลังคว้าเป็นพารามิเตอร์สุดท้ายใน URL ซึ่งคุณไม่ควรพึ่งพา (แม้ว่าคุณจะคาดหวังเพียงหนึ่งพารามิเตอร์) เช่นhttp://myserver/action?myParam=2&anotherParam=3จะให้ผลผลิตไม่ได้แต่"2" "2&anotherParam=3"
Glacials

39
(location.search.split('myParam=')[1]||'').split('&')[0]- เพื่อใช้กับparams หลายหรือpossibliy myParamหายไป
Gábor Imre

หรือlocation.search.split('myParam=').splice(1).join('').split('&')[0]
J.Steve

1
คุณสามารถได้รับความแม่นยำมากขึ้นและอนุญาตให้เรียงลำดับของพารามิเตอร์โดยการเติมด้วย[?|&]ใน[?|&]myParam=([^&]+)
1.21 gigawatts

1
คุณอาจต้องถอดรหัสค่าresult = decodeURIComponent(result);
1.21 gigawatts

126

ผู้ขายเบราว์เซอร์ได้ใช้วิธีการดั้งเดิมผ่าน URL และ URLSearchParams

let url = new URL('http://www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5');
let searchParams = new URLSearchParams(url.search);
console.log(searchParams.get('c'));  // outputs "m2-m3-m4-m5"

ขณะนี้รองรับ Firefox, Opera, Safari, Chrome และ Edge สำหรับรายชื่อของการสนับสนุนเบราว์เซอร์ดูที่นี่

https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams https://developer.mozilla.org/en-US/docs/Web/API/URL/URL

https://url.spec.whatwg.org/

Eric Bidelman วิศวกรของ Google แนะนำให้ใช้polyfillนี้สำหรับเบราว์เซอร์ที่ไม่รองรับ


อ้างอิงตามลิงค์ MDN (s) Safari รองรับ URL แต่ไม่ใช่ URLSearchParams
Mark Thomson

3
@ Markouver Polyfill ไม่ดูแลใช่มั้ย BTW, Safari เป็นยุคใหม่ 'IE6
Csaba Toth

ทำไมถึงnew URLSearchParams("www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5").get('a')กลับมาnullหาฉัน (บน Chrome มีความเสถียร) bและcดูเหมือนว่าจะทำงานได้ดี
ripper234

อัปเดตคำตอบ คำตอบเดิมของฉันใช้ URLSearchParams ไม่ถูกต้องเพราะมันออกแบบมาเพื่อทำงานกับส่วนที่มีการสอบถามของ URL เท่านั้น
cgatian

1
ใช้แทนurl.searchParams new URLSearchParams(url.search)
Caio Tarifa

86

ฉันพบว่าทุกเพศทุกวัยที่ผ่านมาง่ายมาก:

function getUrlVars() {
    var vars = {};
    var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi,    
    function(m,key,value) {
      vars[key] = value;
    });
    return vars;
  }

จากนั้นเรียกมันว่าสิ่งนี้:

var fType = getUrlVars()["type"];

7
+1 โซลูชันที่ยอดเยี่ยม - สง่างามมีประสิทธิภาพและชาญฉลาดคือเงื่อนไขการใช้งาน เพื่อจุดประสงค์ของฉันดีกว่าโซลูชันที่ยอมรับอื่น ๆ
Elemental

short + simple +
Powerful

1
เยี่ยมมากมันใช้งานได้โดยใช้ location.search แทน window.location.href
Fabio C.

1
@pdxbmw มันไร้ประโยชน์และควรถูกลบออก รหัสอาจดูฉลาดเมื่อเห็นอย่างแรก แต่ก็ไม่ได้คิดออกดีนัก การปรับปรุง: ใช้decodeURIComponent()กับมูลค่าเพราะนั่นคือสิ่งที่คุณมักจะต้องการใช้งาน ใช้window.location.searchแทนwindow.location.hrefเพราะคุณสนใจเฉพาะพารามิเตอร์ไม่ใช่ URL ทั้งหมด
Leif

2
ข้อเสนอแนะ @Leif ทำงานได้ดี ฉันได้รับใน ID 142 # เพราะในตอนท้ายของ URL คือ # สร้างขึ้นเมื่อคลิกปุ่ม ออกจากฟังก์ชันนี้ไปแล้วvar vars = {}; window.location.search.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) { vars[key] = value; }); return vars;
Andres Ramos

77

คุณสามารถรับสตริงการสืบค้นlocation.searchจากนั้นคุณสามารถแยกทุกอย่างหลังจากเครื่องหมายคำถาม:

var params = {};

if (location.search) {
    var parts = location.search.substring(1).split('&');

    for (var i = 0; i < parts.length; i++) {
        var nv = parts[i].split('=');
        if (!nv[0]) continue;
        params[nv[0]] = nv[1] || true;
    }
}

// Now you can get the parameters you want like so:
var abc = params.abc;

3
สิ่งที่เกี่ยวกับการถอดรหัส URL ชื่อและค่าพารามิเตอร์?
Ates Goral

วิธีนี้ไม่ได้จัดการกับอาร์เรย์ เช่น?array[]=1&array[]=2ผลิต{"array[]": "2"}ซึ่งผิดอย่างชัดเจน
Kafoso

@Kafoso ไม่มีอะไรถูกหรือผิดชัดเจน ประการแรกฟิลด์ที่มีชื่อซ้ำกันไม่มีลักษณะการทำงานมาตรฐานที่ระบุและขึ้นอยู่กับตัวแยกวิเคราะห์ที่จะจัดการ นอกจากนี้[]รูปแบบมีความหมายเฉพาะในบางกรณี (เช่น PHP) แต่ไม่ใช่รูปแบบอื่น ๆ ดังนั้นไม่ใช่ "ผิดอย่างชัดเจน" - ไม่ใช้เพื่อจัดการกรณีที่ไม่ได้มาตรฐานที่คุณอาจหรืออาจไม่จำเป็นต้องจัดการ
Blixt

38

ฉันเขียนโซลูชันที่เรียบง่ายและสง่างามมากขึ้น

var arr = document.URL.match(/room=([0-9]+)/)
var room = arr[1];

ดูที่สองบรรทัดทำสิ่งที่ตรงกับที่บอกไว้ - และจะไม่แตกหากใครบางคนพยายามตรวจหาช่องโหว่และเพิ่มอักขระพิเศษและแบบสอบถามจำนวนมากซึ่งแตกต่างจากโซลูชันสองสามข้อนี้ ไชโย!
David G

สิ่งนี้ทำงานได้ถูกต้องและใช้ได้เพียง 2 บรรทัดเท่านั้น คำตอบที่ดี!
Andres Ramos

ฉันคิดว่ามันจะเป็นประโยชน์สำหรับคนอื่น ๆ เช็ครวมเป็นโมฆะ ถ้าไม่ใช่ตัวอย่างอยู่ที่นี่: stackoverflow.com/a/36076822/1945948 (ฉันเคยลองแก้ไขถูกปฏิเสธ)
atw

ไม่เข้าใจ ... คำถามนี้ตอบคำถามได้อย่างไรซึ่งเกี่ยวกับการรับพารามิเตอร์จากสตริงเฉพาะ 'www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5'?
ไมค์หนู

ชอบคำตอบนี้ + 1'ed เพียงข้อเสนอแนะคุณสามารถแทนที่[0-9] สำหรับ\d
gmanjon

31

วิธีที่ง่ายสุดใช้URLSearchParams

function getParam(param){
  return new URLSearchParams(window.location.search).get(param);
}

มันได้รับการสนับสนุนในขณะนี้ใน Chrome, Firefox, Safari, ขอบและอื่น ๆ


รับข้อผิดพลาด: 'SCRIPT5009:' URLSearchParams 'ไม่ได้ถูกกำหนดไว้' เมื่อทำงานใน Edge
Andreas Presthammer

@AndreasPresthammer ขอบแบบไหน?
spencer.sm

@ spencer-sm Microsoft Edge 41.16299.820.0
Andreas Presthammer

ไม่ทำงานกับพารามิเตอร์ URL ที่กำหนด
ล่วงหน้า

@ iiiml0sto1 "พารามิเตอร์ URL ที่กำหนดล่วงหน้า" คืออะไร
spencer.sm

30

นี่คือโซลูชันแบบเรียกซ้ำที่ไม่มี regex และมีการกลายพันธุ์น้อยที่สุด (เฉพาะวัตถุ params ถูกกลายพันธุ์ซึ่งฉันเชื่อว่าไม่สามารถหลีกเลี่ยงได้ใน JS)

มันยอดเยี่ยมเพราะ:

  • เป็นแบบเรียกซ้ำ
  • จัดการหลายพารามิเตอร์ในชื่อเดียวกัน
  • จัดการได้ดีกับสตริงพารามิเตอร์ที่ผิดรูปแบบ (ค่าที่หายไปเป็นต้น)
  • ไม่แตกถ้า '=' อยู่ในค่า
  • ทำการถอดรหัส URL
  • และท้ายที่สุดมันยอดเยี่ยมเพราะมัน ... เอ่อ !!!

รหัส:

var get_params = function(search_string) {

  var parse = function(params, pairs) {
    var pair = pairs[0];
    var parts = pair.split('=');
    var key = decodeURIComponent(parts[0]);
    var value = decodeURIComponent(parts.slice(1).join('='));

    // Handle multiple parameters of the same name
    if (typeof params[key] === "undefined") {
      params[key] = value;
    } else {
      params[key] = [].concat(params[key], value);
    }

    return pairs.length == 1 ? params : parse(params, pairs.slice(1))
  }

  // Get rid of leading ?
  return search_string.length == 0 ? {} : parse({}, search_string.substr(1).split('&'));
}

var params = get_params(location.search);

// Finally, to get the param you want
params['c'];

31
คุณ ... คุณพูดซ้ำสองครั้ง
Rage แตกต่างระหว่าง

ไม่พบพารามิเตอร์แรกใน URL ถัดไป: www.mysite.com?first=1&second=2
Mario Radomanana

สวัสดีมาริโอนี่คือ JSFiddle ที่แสดงว่าทำงานกับ URL นั้น: jsfiddle.net/q6xfJ - หากคุณพบข้อผิดพลาดนี่เป็นเบราว์เซอร์ที่เฉพาะเจาะจงหรือไม่ เมื่อทำการทดสอบโปรดทราบว่าคำตอบที่ฉันให้มานั้นใช้ location.search ซึ่งเป็นส่วนของ '? first = 1 & second = 2' ของ URL ไชโย :)
Jai

45
ฉันไม่เห็นว่าทำไมสิ่งที่ดีเพียงเพราะมันวนซ้ำ
Adam Arold

6
เอิ่มฉันคิดว่าคุณพลาดเรื่องตลกไปเที่ยวที่นั่นอดัม แม้ว่าตอนนี้ทุกคนจะพลาดเพราะ edi9999 ลบอันที่สอง "Is recursive"
ใจ

27

ฉันทำฟังก์ชันที่ทำสิ่งนี้:

var getUrlParams = function (url) {
  var params = {};
  (url + '?').split('?')[1].split('&').forEach(function (pair) {
    pair = (pair + '=').split('=').map(decodeURIComponent);
    if (pair[0].length) {
      params[pair[0]] = pair[1];
    }
  });
  return params;
};

อัปเดต 5/26/2017 นี่คือการใช้งาน ES7 (ทำงานกับขั้นตอนที่ Babel ที่กำหนดไว้ล่วงหน้า 0, 1, 2 หรือ 3):

const getUrlParams = url => `${url}?`.split('?')[1]
  .split('&').reduce((params, pair) =>
    ((key, val) => key ? {...params, [key]: val} : params)
    (...`${pair}=`.split('=').map(decodeURIComponent)), {});

การทดสอบบางอย่าง:

console.log(getUrlParams('https://google.com/foo?a=1&b=2&c')); // Will log {a: '1', b: '2', c: ''}
console.log(getUrlParams('/foo?a=1&b=2&c')); // Will log {a: '1', b: '2', c: ''}
console.log(getUrlParams('?a=1&b=2&c')); // Will log {a: '1', b: '2', c: ''}
console.log(getUrlParams('https://google.com/')); // Will log {}
console.log(getUrlParams('a=1&b=2&c')); // Will log {}

อัปเดต 3/26/2018 นี่คือการใช้ typescript:

const getUrlParams = (search: string) => `${search}?`
  .split('?')[1]
  .split('&')
  .reduce(
    (params: object, pair: string) => {
      const [key, value] = `${pair}=`
        .split('=')
        .map(decodeURIComponent)

      return key.length > 0 ? { ...params, [key]: value } : params
    },
    {}
  )

อัปเดต 2/13/2019 นี่คือการใช้งาน TypeScript ที่อัปเดตซึ่งทำงานกับ TypeScript 3

interface IParams { [key: string]: string }

const paramReducer = (params: IParams, pair: string): IParams => {
  const [key, value] = `${pair}=`.split('=').map(decodeURIComponent)

  return key.length > 0 ? { ...params, [key]: value } : params
}

const getUrlParams = (search: string): IParams =>
  `${search}?`.split('?')[1].split('&').reduce<IParams>(paramReducer, {})

ใน URL ที่ไม่มีพารามิเตอร์การค้นหาสิ่งนี้จะส่งคืนObject {"": ""}
Ilya Semenov

2
ดูสะอาดพอสำหรับฉัน คำตอบที่เหลือนั้นเป็น "เวทมนต์" มากเกินไปโดยไม่มีคำอธิบายเพียงพอ
Levi Roberts

นี่คือคำตอบที่ยอดเยี่ยม!
สเปนเซอร์ Bigum

ขอบคุณ @SpencerBigum!
Nate Ferrero

24

ดูนี่

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

1
ขอบคุณ ฉันใหม่กับ jscript และมันจะมีประโยชน์ทีเดียว
Brian B.

20

โซลูชัน ECMAScript 6:

var params = window.location.search
  .substring(1)
  .split("&")
  .map(v => v.split("="))
  .reduce((map, [key, value]) => map.set(key, decodeURIComponent(value)), new Map())

ดี FYI เนื่องจากเป็นแผนที่การใช้งานคือ params.get ("key");
evanmcd

ฉันชอบ แต่อาจจะไม่ได้รับสิ่งแรก ฉันสร้างฟังก์ชั่นตามตัวอย่างของคุณ function urlParams(url) { const [, searchParams = ''] = url.split('?') return searchParams.split('&') .map(v => v.split('=')) .reduce((map, [key = '', value]) => key.length ? map.set(key, decodeURIComponent(value)) : map, new Map()) }
mah.cr

11

ฉันใช้

function getVal(str) {
    var v = window.location.search.match(new RegExp('(?:[\?\&]'+str+'=)([^&]+)'));
    return v ? v[1] : null;
}

โปรดเพิ่มคำอธิบายบางอย่าง คำตอบของคุณถูกตั้งค่าสถานะว่า "คุณภาพต่ำ" และอาจถูกลบออกในที่สุด
Johannes Jander

ฉันพบว่าหากมีสตริงเช่น '#id' ที่ท้าย URL และส่งคืนค่าพารามิเตอร์สุดท้ายเช่น 'somevalue # id'
Ayano

@Ayano window.location.searchจะไม่รวมแฮชเช่น#idกัน
Fancyoung

@Fancyoung ใช่คุณพูดถูกฉันทำผิดพลาดที่ใช้location.hrefจับคู่ผลลัพธ์แทนคำlocation.searchขอบคุณ
Ayano

11

ฉันใช้ไลบรารีparseUri ช่วยให้คุณทำสิ่งที่คุณขอได้อย่างถูกต้อง:

var uri = 'www.test.com/t.html&a=1&b=3&c=m2-m3-m4-m5';
var c = uri.queryKey['c'];
// c = 'm2-m3-m4-m5'

9

นี่คือทางออกของฉัน ตามที่ Andy E ให้คำแนะนำในขณะที่ตอบคำถามนี้มันไม่ดีสำหรับประสิทธิภาพของสคริปต์ของคุณหากมันสร้างสายอักขระ Regex ซ้ำ ๆ ใช้ลูป ฯลฯ เพื่อรับค่าเดียว ดังนั้นฉันจึงคิดสคริปต์ที่เรียบง่ายซึ่งคืนค่าพารามิเตอร์ GET ทั้งหมดในวัตถุเดียว คุณควรเรียกมันเพียงครั้งเดียวกำหนดผลลัพธ์ให้กับตัวแปรจากนั้น ณ เวลาใด ๆ ในอนาคตจะได้รับค่าใด ๆ ที่คุณต้องการจากตัวแปรนั้นโดยใช้คีย์ที่เหมาะสม โปรดทราบว่ามันยังดูแลการถอดรหัส URI (เช่นสิ่งต่าง ๆ เช่น% 20) และแทนที่ด้วยช่องว่าง:

 function getUrlQueryParams(url) {
  var queryString = url.split("?")[1];
  var keyValuePairs = queryString.split("&");
  var keyValue = [];
  var queryParams = {};
  keyValuePairs.forEach(function(pair) {
    keyValue = pair.split("=");
    queryParams[keyValue[0]] = decodeURIComponent(keyValue[1]).replace(/\+/g, " ");
});
  return queryParams;
}

ดังนั้นนี่คือการทดสอบบางส่วนของสคริปต์เพื่อให้คุณดู:

// Query parameters with strings only, no special characters.
var currentParams = getUrlQueryParams("example.com/foo?number=zero");
alert(currentParams["number"]); // Gives "zero".

// For the URL you stated above...
var someParams = getUrlQueryParams("www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5 ");
alert(someParams["c"]); // Gives "m2-m3-m4-m5".

// For a query params with URI encoding...
var someParams = getUrlQueryParams("www.example.com/t.html?phrase=a%20long%20shot&location=Silicon+Valley%2C+USA");
alert(someParams["phrase"]); // Gives "a long shot".
alert(someParams["location"]); // Gives "Silicon Valley, USA".

.replace ("+", "") จะแทนที่เหตุการณ์แรกที่คุณต้องใช้เท่านั้น. แทนที่ (/ \ + / g, "");
โทนี่

8

หรือถ้าคุณไม่ต้องการที่จะบูรณาการล้อแยก URI ใช้URI.js

ในการรับค่าของพารามิเตอร์ชื่อ foo:

new URI((''+document.location)).search(true).foo

นั่นมันคืออะไร

  1. แปลง document.location เป็นสตริง (เป็นวัตถุ)
  2. ฟีดสตริงนั้นไปยังตัว จำกัด คลาส URI ของ URI
  3. เรียกใช้ฟังก์ชั่นการค้นหา () เพื่อรับส่วนการค้นหา (แบบสอบถาม) ของ URL
    (ผ่าน True บอกให้เอาท์พุทวัตถุ)
  4. เข้าถึงคุณสมบัติ foo บนวัตถุผลลัพธ์เพื่อรับค่า

นี่คือซอสำหรับเรื่องนี้ .... http://jsfiddle.net/m6tett01/12/


8

สำหรับค่าพารามิเตอร์เดียวเช่น index.html? msg = 1 ให้ใช้รหัสต่อไปนี้

$(window).load(function(){
    queryString();
});

function queryString()
{
    var queryString = window.location.search.substring(1);
    var varArray = queryString.split("="); //eg. index.html?msg=1

    var param1 = varArray[0];
    var param2 = varArray[1];

}

สำหรับค่าพารามิเตอร์ทั้งหมดให้ใช้รหัสต่อไปนี้

$(window).load(function(){
    queryString();
});

function queryString()
{
    var queryString = window.location.search;
    var varArray = queryString.split("&");
    for (var i=0;i<varArray.length;i++) {
      var param = varArray[i].split("=");
        //parameter-value pair
    }
} 

1
ฉันชอบวิธีนี้!
alemur

8

ที่นี่ฉันโพสต์ตัวอย่างหนึ่ง แต่มันอยู่ใน jQuery หวังว่ามันจะช่วยให้ผู้อื่น:

<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="jquery.url.js"></script>

<!-- URL:  www.example.com/correct/?message=done&year=1990-->

<script type="text/javascript">
$(function(){
    $.url.attr('protocol')  // --> Protocol: "http"
    $.url.attr('path')          // --> host: "www.example.com"
    $.url.attr('query')         // --> path: "/correct/"
    $.url.attr('message')   // --> query: "done"
    $.url.attr('year')      // --> query: "1990"
});
</script>

1
คัดลอกมาจากโพสต์อื่น ๆ ของคุณ: "ต้องใช้ปลั๊กอิน url: plugins.jquery.com/url"
zeta

8

วิธีที่สั้นที่สุด:

new URL(location.href).searchParams.get("my_key");

2
ฉันจะใช้new URL(location.href).searchParams.get("my_key")มากกว่าURLSearchParamsเพราะหลังจะล้มเหลวเมื่อดึงพารามิเตอร์การสืบค้นแรกของ URL ใด ๆ
Travis Clarke

1
ทดสอบทั้งสองสายพันธุ์ ฉันเห็นด้วยกับคุณ. แก้ไขคำตอบ
Zon

7

คำถามนี้มีคำตอบมากเกินไปฉันกำลังเพิ่มอีกหนึ่งคำถาม

/**
 * parses and returns URI query parameters 
 * 
 * @param {string} param parm
 * @param {bool?} asArray if true, returns an array instead of a scalar 
 * @returns {Object|Array} 
 */
function getURIParameter(param, asArray) {
    return document.location.search.substring(1).split('&').reduce(function(p,c) {
        var parts = c.split('=', 2).map(function(param) { return decodeURIComponent(param); });
        if(parts.length == 0 || parts[0] != param) return (p instanceof Array) && !asArray ? null : p;
        return asArray ? p.concat(parts.concat(true)[1]) : parts.concat(true)[1];
    }, []);
}

การใช้งาน:

getURIParameter("id")  // returns the last id or null if not present
getURIParameter("id", true) // returns an array of all ids

copes นี้ที่มีพารามิเตอร์ว่าง (คีย์เหล่านั้นไม่มีอยู่"=value") การเปิดเผยทั้ง API แบบสเกลาและการเรียกค่าตามอาร์เรย์รวมถึงการถอดรหัสคอมโพเนนต์ URI ที่เหมาะสม


7

วิธีที่ง่ายที่สุดโดยใช้replace()วิธีการ:

จากurlStrสตริง:

paramVal = urlStr.replace(/.*param_name=([^&]*).*|(.*)/, '$1');

หรือจากURLปัจจุบัน:

paramVal = document.URL.replace(/.*param_name=([^&]*).*|(.*)/, '$1');

คำอธิบาย:

  • document.URL - อินเตอร์เฟสส่งคืนตำแหน่งเอกสาร (URL หน้า) เป็นสตริง
  • replace()- วิธีการส่งกลับสตริงใหม่ที่มีบางส่วนหรือการแข่งขันทั้งหมดของรูปแบบการแทนที่ด้วยการเปลี่ยน
  • /.*param_name=([^&]*).*/- รูปแบบการแสดงออกปกติล้อมรอบระหว่างทับซึ่งหมายความว่า:
    • .* - อักขระใด ๆ ศูนย์หรือมากกว่า
    • param_name= - ชื่อ param ที่ serched
    • () - กลุ่มในการแสดงออกปกติ
    • [^&]*- หนึ่งหรือมากกว่าของตัวอักษรใดไม่รวม&,
    • | - การสลับ
    • $1 - การอ้างอิงถึงกลุ่มแรกในการแสดงออกปกติ

var urlStr = 'www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5';
var c = urlStr.replace(/.*c=([^&]*).*|(.*)/, '$1');
var notExisted = urlStr.replace(/.*not_existed=([^&]*).*|(.*)/, '$1');
console.log(`c === '${c}'`);
console.log(`notExisted === '${notExisted}'`);


1
วิธีแก้ปัญหาที่ดี แต่ถ้าไม่พบพารามิเตอร์สตริงทั้งหมดจะถูกส่งกลับ ฉันคาดว่า "ไม่ได้กำหนด" ในกรณีนี้
Pensan

1
สวัสดี @ pensan ขอขอบคุณสำหรับความคิดเห็นที่ดีของคุณ ฉันเพียงเพิ่มนิพจน์ปกติการจัดการสถานการณ์เมื่อพารามิเตอร์ไม่ปรากฏใน URL ในกรณีนี้เราจะได้รับสตริง emty (ไม่ใช่ทั้งสตริง)
simhumileco

6

อีกข้อเสนอแนะ

มีคำตอบที่ดีอยู่แล้ว แต่ฉันพบว่ามันซับซ้อนและไม่เข้าใจยาก นี่คือสั้น ๆ ง่าย ๆ และคืนค่าอาเรย์แบบเชื่อมโยงอย่างง่ายที่มีชื่อคีย์ที่สอดคล้องกับชื่อโทเค็นใน URL

ฉันเพิ่มเวอร์ชันพร้อมความคิดเห็นด้านล่างสำหรับผู้ที่ต้องการเรียนรู้

โปรดทราบว่านี่ต้องอาศัย jQuery ($ .each) สำหรับลูปของมันซึ่งฉันแนะนำให้ใช้แทน forEach ฉันพบว่าง่ายกว่าเพื่อให้แน่ใจว่าสามารถใช้งานร่วมกับเบราว์เซอร์ข้ามเบราว์เซอร์ได้โดยใช้ jQuery ทั่วทั้งบอร์ดแทนที่จะเสียบในแต่ละการแก้ไขเพื่อรองรับฟังก์ชั่นใหม่ที่ไม่รองรับเบราว์เซอร์รุ่นเก่า

แก้ไข: หลังจากที่ฉันเขียนสิ่งนี้ฉันสังเกตเห็นคำตอบของ Eric Elliott ซึ่งเกือบเหมือนกันถึงแม้ว่ามันจะใช้ forEach แต่ละครั้งในขณะที่ฉันต่อต้าน (ด้วยเหตุผลที่กล่าวมาข้างต้น)

function getTokens(){
    var tokens = [];
    var query = location.search;
    query = query.slice(1);
    query = query.split('&');
    $.each(query, function(i,value){    
        var token = value.split('=');   
        var key = decodeURIComponent(token[0]);     
        var data = decodeURIComponent(token[1]);
        tokens[key] = data;
    });
    return tokens;
}

รุ่นที่แสดงความคิดเห็น:

function getTokens(){
    var tokens = [];            // new array to hold result
    var query = location.search; // everything from the '?' onward 
    query = query.slice(1);     // remove the first character, which will be the '?' 
    query = query.split('&');   // split via each '&', leaving us an array of something=something strings

    // iterate through each something=something string
    $.each(query, function(i,value){    

        // split the something=something string via '=', creating an array containing the token name and data
        var token = value.split('=');   

        // assign the first array element (the token name) to the 'key' variable
        var key = decodeURIComponent(token[0]);     

        // assign the second array element (the token data) to the 'data' variable
        var data = decodeURIComponent(token[1]);

        tokens[key] = data;     // add an associative key/data pair to our result array, with key names being the URI token names
    });

    return tokens;  // return the array
}

สำหรับตัวอย่างด้านล่างเราจะถือว่าที่อยู่นี้:

http://www.example.com/page.htm?id=4&name=murray

คุณสามารถกำหนดโทเค็น URL ให้กับตัวแปรของคุณเอง:

var tokens = getTokens();

จากนั้นอ้างถึงโทเค็น URL แต่ละชื่อตามชื่อดังนี้:

document.write( tokens['id'] );

สิ่งนี้จะพิมพ์ "4"

นอกจากนี้คุณยังสามารถอ้างถึงชื่อโทเค็น aa จากฟังก์ชันโดยตรง:

document.write( getTokens()['name'] );

... ซึ่งจะพิมพ์ "murray"


6
// Read a page's GET URL variables and return them as an associative array.
function getUrlVars()
{
    var vars = [], hash;
    var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
    for(var i = 0; i < hashes.length; i++)
    {
        hash = hashes[i].split('=');
        vars.push(hash[0]);
        vars[hash[0]] = hash[1];
    }
    return vars;
}

// Usage for URL: http://my.site.com/location?locationId=53cc272c0364aefcb78756cd&shared=false
var id = getUrlVars()["locationId"];

ได้จากที่นี่: http://jquery-howto.blogspot.ru/2009/09/get-url-parameters-values-with-jquery.html


6

วิธีง่ายๆ

function getParams(url){
        var regex = /[?&]([^=#]+)=([^&#]*)/g,
            params = {},
            match;
        while(match = regex.exec(url)) {
            params[match[1]] = match[2];
        }
        return params;
    }

จากนั้นเรียกมันว่า getParams (url)


5

ฉันจำเป็นต้องอ่านตัวแปร URL GET และดำเนินการให้เสร็จตามพารามิเตอร์ url ฉันค้นหาคำตอบสูงและต่ำและพบรหัสชิ้นเล็กชิ้นน้อยนี้ โดยทั่วไปจะอ่าน URL หน้าปัจจุบันดำเนินการนิพจน์ปกติบางอย่างบน URL จากนั้นบันทึกพารามิเตอร์ URL ในอาร์เรย์ที่เชื่อมโยงซึ่งเราสามารถเข้าถึงได้ง่าย

ดังนั้นเป็นตัวอย่างถ้าเรามี URL ต่อไปนี้พร้อมกับจาวาสคริปต์ที่ด้านล่างในสถานที่

http://TestServer/Pages/NewsArchive.aspx?year=2013&Month=July

ทั้งหมดที่เราต้องทำเพื่อให้ id พารามิเตอร์และหน้ามีการเรียกสิ่งนี้:

รหัสจะเป็น:

<script type="text/javascript">
var first = getUrlVars()["year"];
var second = getUrlVars()["Month"];

alert(first);
alert(second);
function getUrlVars() {
var vars = {};
var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) {
vars[key] = value;
});
return vars;
}
</script>

ทำงานให้ฉันขอบคุณ
OJB1

5
// http:localhost:8080/path?param_1=a&param_2=b
var getParamsMap = function () {
    var params = window.location.search.split("&");
    var paramsMap = {};
    params.forEach(function (p) {
        var v = p.split("=");
        paramsMap[v[0]]=decodeURIComponent(v[1]);
    });
    return paramsMap;
};

// -----------------------

console.log(getParamsMap()["param_1"]);  // should log "a"     

ส่งคืนพารามิเตอร์แรกด้วย '?'
Pini Cheyni

5

สรุปสาระสำคัญโดย Eldon McGuinnessนี้เป็นการดำเนินการที่สมบูรณ์ที่สุดของตัวแยกวิเคราะห์สตริงการสืบค้น 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;
}

// DEMO
console.log(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"));

ดูซอนี้


สิ่งที่ฉันไม่เข้าใจเกี่ยวกับจาวาสคริปต์คือทำไมพวกเขาถึงไม่สร้างและวางฟังก์ชันการแยกวิเคราะห์ url เป็นภาษาของตัวเองหรืออย่างน้อยก็ในห้องสมุดมาตรฐาน? สิ่งที่ต่ำในระดับนี้ไม่ควรมีการคิดค้นซ้ำแล้วซ้ำอีกและไม่เหลือให้นักพัฒนาเพื่อใช้โซลูชั่นใด ๆ ที่พวกเขาจะชักนำ ถ้านี่เป็นของแข็งแล้วควรทำอะไรเช่นนี้ในไลบรารี่มาตรฐาน นี่คือตัวอย่างของประเภทของสิ่งต่าง ๆ ในจาวาสคริปต์ที่ทำให้ฉันกลายเป็นภาษา
ahnbizcad

5

โซลูชันสไตล์ที่หรูหราและใช้งานได้ดี

มาสร้างวัตถุที่มีชื่อพารามิเตอร์ URL เป็นคีย์จากนั้นเราสามารถแยกพารามิเตอร์ตามชื่อ:

// URL: https://example.com/?test=true&orderId=9381  

// Build an object containing key-value pairs
export const queryStringParams = window.location.search
  .split('?')[1]
  .split('&')
  .map(keyValue => keyValue.split('='))
  .reduce<QueryStringParams>((params, [key, value]) => {
    params[key] = value;
    return params;
  }, {});

type QueryStringParams = {
  [key: string]: string;
};


// Return URL parameter called "orderId"
return queryStringParams.orderId;

รักสิ่งนี้ แต่ไม่ได้ผลสำหรับฉันโดยไม่ทำให้แน่ใจว่าได้ส่งคืนตัวสะสมในฟังก์ชันลด
Ella

@Ella มันเป็นตัวพิมพ์ใหญ่ไม่มีทางที่มันจะทำงานได้โดยไม่ต้องมีreturn

ดูดีขึ้นตอนนี้หวังว่าคุณจะไปที่หน้าแรก!
เอลล่า

4

นี่คือสิ่งที่ฉันทำ:

var uriParams = getSearchParameters();
alert(uriParams.c);


// background functions:

// Get object/associative array of URL parameters
function getSearchParameters () {
  var prmstr = window.location.search.substr(1);
  return prmstr !== null && prmstr !== "" ? transformToAssocArray(prmstr) : {};
}

// convert parameters from url-style string to associative array
function transformToAssocArray (prmstr) {
  var params = {},
      prmarr = prmstr.split("&");

  for (var i = 0; i < prmarr.length; i++) {
    var tmparr = prmarr[i].split("=");
    params[tmparr[0]] = tmparr[1];
  }
  return params;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.