Як отримати значення з параметрів 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) ви можете використовувати цей поліфайл або код з оригінальної версії цієї відповіді, яка передує 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);

Для старих веб-переглядачів вам може знадобитися поліфактор дляURL додаткового URLSearchParams. Або ви можете ухилитися від цього питання, замінивши рядок var c = url.searchParams.get("c");у відповіді вище на var c = new URLSearchParams(window.location.search).get("c");.
evanrmurphy

parse_query_string не вдасться для значень, що містять '=', як, наприклад, при передачі базового кодованого значення як значення. Версія, що використовує регулярний вираз нижче, працює краще.
Manel Clos

7
@Jamland - Абсолютно не робіть цього. Це зламає речі. Ось демонстрація в реальному часі new URL() очікує отримання правильно закодованої URL-адреси в якості аргументу. decodeURIComponentочікує, що буде передано компонент URL-адреси, а не цілу URL-адресу.
Квентін

@Quentin Я перевірив різні спеціальні характеристики і бачу, що ти маєш рацію. decodeURIComponentне слід використовувати в цьому випадку
Jamland

1
parse_query_stringФункція робить подвійне декодування value. =Випущеним згадується @ManelClos може бути вирішена шляхом додавання другого параметра 2( limit) до vars[i].split().
Джейк

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
Цей код не працює. Він створює нескінченний цикл, тому що регулярний вираз складається за визначенням циклу, який скидає поточний індекс. Він працює належним чином, якщо ви помістите регулярний вираз у змінну за межами циклу.
maxhawkins

2
@maxhawkins: Він працює в деяких браузерах, а в інших він переходить у нескінченний цикл. Ти з тобою напівправий. Я зафіксую код для перехресного перегляду. Дякуємо, що вказали на це!
Атес Гораль

3
@ZiTAL Ця функція повинна використовуватись із частиною запиту URL-адреси, а не всією URL-адресою. Дивіться приклад використання коментованого використання нижче.
Атес Горал

1
@Harvey Нечутливість випадку не стосується параметрів запиту. Це звучить як річ, специфічна для додатків, яку слід застосовувати разом із вилученням параметрів запиту чи поверх них.
Атес Гораль

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
Цей варіант мені найбільше подобається, але я вважаю за краще повернути нуль або результат, але не порожній рядок.
Джейсон Трашер

1
Схоже, у вас є додаткові знаки втечі. "\\[" має бути "\[". Оскільки це звичайні рядки, [і] не потрібно уникати.
EricP

Це нечутливе до випадку. Куди б я додати «я», щоб зробити його нечутливим?
зета

попередження (gup ('UserID', window.location.href));
Arun Prasad ES

6
@mottie мертве посилання
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]- використовувати з декількома парамами або відсутніми можливостями myParam .
Габор Імре

абоlocation.search.split('myParam=').splice(1).join('').split('&')[0]
Дж.Стев

1
Ви можете отримати більш високу точність і дозволяють будь-який порядок параметрів, випереджаючи з [?|&]як в[?|&]myParam=([^&]+)
1,21 гігават

1
Можливо, вам знадобиться розшифрувати значенняresult = decodeURIComponent(result);
1,21 гігаватт

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/

Ерік Бідельман, інженер Google, рекомендує використовувати цю поліфункцію для непідтримуваних веб-переглядачів.


Відповідно до посилань (-ів) MDN, які підтримують Safari, але не URL-адрес пошуку.
Марк Томсон

3
@Markouver Хіба поліфіл не піклується про це? 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).
Кайо Таріфа

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 чудове рішення - елегантний, ефективний та розумний - це умови використання. Для моїх цілей краще, ніж інше прийняте рішення
Елементальний

короткий + простий + потужний = великий
мзи

1
Дуже приємно, він також працює з використанням location.search замість window.location.href
Fabio C.

1
@pdxbmw Це марно і його слід видалити. Код на перший погляд може здатися розумним, але не дуже продуманий. Вдосконалення: використовуйте decodeURIComponent()цінність, тому що саме з цим зазвичай ви хочете працювати; використовувати window.location.searchзамість window.location.href, тому що вас цікавлять лише параметри, а не весь URL.
Лейф

2
Пропозиція @Leif чудово працювала. Я отримував ідентифікатор 142 #, тому що в кінці URL-адреса було створено #, натиснуте на кнопку. Залишивши цю функціюvar vars = {}; window.location.search.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) { vars[key] = value; }); return vars;
Андрес Рамос

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-адрес імен та значень параметрів?
Атес Горал

Цей підхід не обробляє масиви. Напр. ?array[]=1&array[]=2Виробляє {"array[]": "2"}, що явно неправильно.
Кафосо

@Kafoso Тут немає чіткого правильного чи неправильного. Перш за все, повторювані поля з тими самими іменами не мають визначеної стандартної поведінки, і до розбору належить розбиратися. Крім того, []модель має значення лише в деяких випадках (наприклад, PHP), але не в інших. Тож не "явно неправильно" - просто не реалізовано для обробки нестандартного випадку, з яким вам може знадобитися чи не потрібно.
Blixt

38

Я написав більш просте і елегантне рішення.

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

Подивіться на це, два рядки робить саме те, що написано на бляшанці, - і не зламається, якщо хтось намагається перевірити на вразливості та додасть купу додаткових символів та запитів на відміну від пари цих рішень. Здрастуйте, хлопець!
Девід Г

Це робить роботу правильно і лише в 2 рядки. Чудова відповідь!
Андрес Рамос

Я думаю, що було б корисно для інших було включено перевірку на наявність нуля. Якщо ні, то тут є приклад: stackoverflow.com/a/36076822/1945948 (у мене була відхилена спроба редагування).
atw

Не розумієте ... як це відповідає на запитання, що стосується отримання парами з певного рядка, "www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5"?
мійський гризун

Подобалася ця відповідь, +1. Лише пропозицію, яку можна замінити [0-9] на\d
gmanjon

31

Супер простий спосіб використання URLSearchParams .

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

Зараз він підтримується в Chrome, Firefox, Safari, Edge та інших .


Отримайте помилку: 'SCRIPT5009:' URLSearchParams 'не визначено' під час запуску в Edge.
Андреас Престхаммер

@AndreasPresthammer Яка версія краю?
spencer.sm

@ spencer-sm Microsoft Edge 41.16299.820.0
Andreas Presthammer

Не працює з попередньо встановленими параметрами URL-адреси
ii iml0sto1

@ iiiml0sto1 Що таке "попередньо визначені параметри URL-адреси"?
spencer.sm

30

Ось рекурсивне рішення, яке не має регулярного вираження та має мінімальну мутацію (мутується лише об’єкт парам, який, на мою думку, неминучий у 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
Ви ... ви сказали рекурсивно двічі.
Дисидентська лють

Він не може знайти перший парам у наступній URL-
адресі

Привіт Маріо, ось JSFiddle, який показує, що він працює з цією URL-адресою: jsfiddle.net/q6xfJ - Якщо ви знайшли помилку, чи може це стосується браузера? Під час тестування зауважте, що відповідь, яку я надав, використовує location.search, що є частиною URL-адреси "? First = 1 & second = 2". Ура :)
Jai

45
Я не бачу, чому щось добре тільки тому, що воно є рекурсивним.
Адам Арольд

6
Ем, я думаю, ти пропустив жарт про рекурсію там, Адам. Хоча зараз всі це пропустять, оскільки edi9999 видалив друге "Рекурсивно".
Джай

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

Оновлення 26.05.2017. Ось реалізація ES7 (працює з попередньо встановленою ступінкою 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 {}

Оновлення 26.03.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
    },
    {}
  )

Оновлення 13.02.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 {"": ""}
Ілля Семенов

2
Мені виглядає досить чисто. Решта відповідей - просто занадто "магія" без достатнього пояснення.
Леві Робертс

Це приголомшлива відповідь!
Спенсер Бігум

Дякую @SpencerBigum!
Нейт Ферреро

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, і це буде дуже корисно.
Брайан Б.

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, оскільки це Map, використання є params.get ("ключ");
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;
}

Будь ласка, додайте пояснення. На даний момент ваша відповідь позначена "низькою якістю" і з часом може бути видалена без.
Йоханнес Яндер

Я виявив, що якщо в кінці URL-адреси є рядок типу "#id", і повернути останнє значення параметра, наприклад "somevalue # id",
Ayano

@Ayano window.location.searchне включатиме хеш, як #id.
Fancyoung

@Fancyoung Так, ви праві, я допустив помилку, яка використовує location.hrefрезультат, а не результат. location.searchДякую.
Айяно

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

Ось моє рішення. Як радив Енді Е, відповідаючи на це питання , це не добре для продуктивності вашого сценарію, якщо він неодноразово будує різні рядки з регулярними виразками, виконує цикли тощо, щоб отримати єдине значення. Отже, я придумав більш простий скрипт, який повертає всі параметри 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 ("+", "") замінить лише перше виникнення, яке потрібно використовувати .replace (/ \ + / g, "");
Тоні

8

Або якщо ви не хочете винаходити колесо для розбору URI, використовуйте URI.js

Щоб отримати значення параметра з ім'ям foo:

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

Що це робить

  1. Перетворити document.location у рядок (це об’єкт)
  2. Подайте цей рядок конструктору класу URI.js
  3. Викликайте функцію search (), щоб отримати частину URL-адреси пошуку (запиту)
    (передача істини підказує йому для виведення об'єкта)
  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
Мені подобається це рішення!
алемур

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.
Тревіс Кларк

1
Випробували обидва варіанти. Я погоджуюсь з тобою. Редагував відповідь.
Зон

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

це справляється з порожніми параметрами (ті клавіші, які присутні без "=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= - ім'я парам, що прослуховується,
    • () - група в регулярному вираженні,
    • [^&]*- один або більше будь-яких символів , за винятком &,
    • | - чергування,
    • $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
Приємне рішення, але якщо параметр не знайдений, весь рядок повертається. Я б очікував "невизначеного" в цьому випадку.
пенсан

1
Привіт @pensan, дякую за чудовий коментар. Я просто додаю до регулярного виразу обробку ситуації, коли параметр не відображається в URL-адресі. У цьому випадку ми отримуємо рядок emty (не цілу рядок).
simhumileco

6

Ще одна пропозиція.

Є вже кілька хороших відповідей, але я вважав їх непотрібними складними і важкими для розуміння. Це короткий, простий і повертає простий асоціативний масив з іменами ключів, що відповідають іменам токенів у URL.

Я додав версію з коментарями нижче для тих, хто хоче вчитися.

Зверніть увагу, що це покладається на jQuery ($ .each) для його циклу, який я рекомендую замість forEach. Мені простіше забезпечити сумісність між веб-браузерами за допомогою jQuery по всій дошці, а не підключення окремих виправлень для підтримки тих, які нові функції не підтримуються у старих браузерах.

Редагувати: Після того як я написав це, я помітив відповідь Еріка Елліотта, яка майже однакова, хоча вона використовується дляEach, хоча я взагалі проти (з причин, зазначених вище).

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

... який би надрукував "муррей".


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-адреса з JavaScript у нижній частині.

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

Все, що нам потрібно зробити, щоб отримати ідентифікатор параметрів та сторінку, - це викликати це:

Кодекс буде:

<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"     

Це повертає перший параметр з "?"
Піні Чейні

5

Цей історія Елдона МакГіннес на сьогодні є найбільш повною реалізацією синтаксичного аналізатора рядків запитів, який я бачив досі.

На жаль, він написаний як плагін 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"));

Дивіться також цю скрипку .


Що я не розумію в JavaScript, це те, чому вони не зробили і не розмістили функції розбору URL-адреси в самій мові або принаймні в бібліотеці стандартів? Матеріали низького рівня ilke цього не повинні переосмислювати знову і знову, а також не залишати розробникам використовувати будь-які ентропічно варіанти рішення, які вони будуть бачити. Якщо це суцільно, то щось подібне слід внести до стандартної бібліотеки. Це приклад типу речі в JavaScript, яка відключає мене до мови.
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 це був друкарський помилок, без нього не обійтися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;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.