Как получить значение из параметров GET? - PullRequest
1138 голосов
/ 11 июня 2009

У меня есть URL с некоторыми параметрами GET следующим образом:

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

Мне нужно получить полное значение c. Я пытался прочитать URL, но я получил только m2. Как мне сделать это с помощью JavaScript?

Ответы [ 53 ]

1645 голосов
/ 11 июня 2009

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);
238 голосов
/ 08 июля 2009

Большинство реализаций, которые я видел, пропускают 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);
220 голосов
/ 11 июня 2009

источник

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')
186 голосов
/ 02 декабря 2013

Это простой способ проверить только один параметр:

Пример URL:

    http://myserver/action?myParam=2

Пример Javascript:

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

если в URL существует "myParam" ... переменная 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 полон параметров.

108 голосов
/ 18 февраля 2016

Поставщики браузеров реализовали собственный способ сделать это через 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, рекомендует использовать этот polyfill для неподдерживаемых браузеров.

76 голосов
/ 20 ноября 2013

Я нашел это давным-давно, очень легко:

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

Тогда назовите это так:

var fType = getUrlVars()["type"];
75 голосов
/ 11 июня 2009

Вы можете получить строку запроса в 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;
37 голосов
/ 15 октября 2014

Я написал более простое и элегантное решение.

var arr = document.URL.match(/room=([0-9]+)/)
var room = arr[1];
28 голосов
/ 16 января 2014

Вот рекурсивное решение, которое не имеет регулярных выражений и имеет минимальную мутацию (мутирует только объект 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'];
24 голосов
/ 06 января 2012

Смотрите это

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";
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...