Захватить значение из строки запроса с помощью регулярного выражения?

Я пытаюсь выбрать только то, что идет после name= и до & в:

"/pages/new?name=J&return_url=/page/new"

Пока у меня..

^name=(.*?).

Я пытаюсь вернуть в этом случае только J, но он динамический, поэтому он может содержать несколько символов, букв или цифр.

Конечная ситуация позволила бы мне сделать оператор replace для этой динамической переменной, найденной регулярным выражением.


person Trip    schedule 12.04.2012    source источник
comment
Что делает ^? Что мешало бы работать?   -  person    schedule 12.04.2012
comment
возможный дубликат Получить значения строки запроса в JavaScript   -  person Álvaro González    schedule 12.04.2012
comment
Слишком много Альваро. И определенно не тот ответ, который я ищу.   -  person Trip    schedule 12.04.2012


Ответы (9)


/name=([^&]*)/

  • удалите ^ и закончите &

Пример:

var str     = "/pages/new?name=J&return_url=/page/new";
var matches = str.match(/name=([^&]*)/);
alert(matches[1]);

Лучший способ - разбить все параметры (пример с использованием текущего адреса):

function getParams (str) {
   var queryString = str || window.location.search || '';
   var keyValPairs = [];
   var params      = {};
   queryString     = queryString.replace(/.*?\?/,"");

   if (queryString.length)
   {
      keyValPairs = queryString.split('&');
      for (pairNum in keyValPairs)
      {
         var key = keyValPairs[pairNum].split('=')[0];
         if (!key.length) continue;
         if (typeof params[key] === 'undefined')
         params[key] = [];
         params[key].push(keyValPairs[pairNum].split('=')[1]);
      }
   }
   return params;
}


var url    = "/pages/new?name=L&return_url=/page/new";
var params = getParams(url);
params['name'];

Обновлять

Хотя по-прежнему не поддерживается ни в одной версии IE, URLSearchParams предоставляет собственный способ получения значений для других браузеров.

person vol7ron    schedule 12.04.2012
comment
Это захватывает name=, я хочу, чтобы появилось после name= и перед & - person Trip; 12.04.2012
comment
Покажите остальную часть кода. Если вы присвоите его массиву, массив будет содержать совпадения, иначе вам придется использовать RegExp.$1 - person vol7ron; 12.04.2012
comment
Что касается последнего обновления, я получаю, что невозможно сделать оператор регулярного выражения, который выбирает что-то после определенного символа и перед другим символом. Предположим, это не URL, а просто строка? - person Trip; 12.04.2012
comment
@Trip: нет, первое регулярное выражение работает, вы никогда не говорили, как вы его назначаете. - person vol7ron; 12.04.2012
comment
Ах, мои извинения, vol7ron. :D Ужасно жаль. Пытаюсь сделать замену. Я обновлю свой вопрос. - person Trip; 12.04.2012
comment
@Trip: перечислил пример соответствия для назначения. Обратите внимание, что если matches ничему не соответствует, оно будет нулевым. - person vol7ron; 12.04.2012
comment
Эта функция может быть излишней, но она необходима, если у вас есть повторяющиеся ключи, такие как name=J&name=K, что является допустимым. Даже если есть только один, я все равно помещаю его в массив, чтобы я мог обрабатывать результаты таким же образом. Пример for (var n=params['name'].length;n--){ /*... do something with params['name'][n] ... */ }, который потерпит неудачу только в том случае, если ключ вообще никогда не существовал. - person vol7ron; 12.04.2012
comment
В сжатом примере будет пропущено окончательное совпадение в представленной строке, если в конце строки запроса не будет добавлен символ «&». - person Josh Habdas; 03.03.2014
comment
@JoshH Я предполагаю, что сжатый пример - это первый трехстрочный блок кода. Я не думаю, что вы говорите правильно: "/pages/new?name=J".match(/name=([^&]*)/)[1]; возвращает J, а амперсанда нет. Моя функция getParams также должна работать должным образом. Я думаю, вам нужно показать пример, чтобы увидеть, с какими проблемами вы столкнулись - также обратите внимание, что IE может обрабатывать регулярные выражения по-разному, если вы используете это. - person vol7ron; 28.03.2014

Принятый ответ включает хеш-часть, если сразу после параметров есть хэш. Поскольку @bishoy имеет в своей функции, правильное регулярное выражение будет

/name=([^&#]*)/
person William Neely    schedule 01.09.2015

Улучшение предыдущих ответов:

/**
 *
 * @param {string} name
 * @returns {string|null}
 */
function getQueryParam(name) {
  var q = window.location.search.match(new RegExp('[?&]' + name + '=([^&#]*)'));
  return q && q[1];
}

getQueryParam('a'); // returns '1' on page http://domain.com/page.html?a=1&b=2 
person cruzanmo    schedule 15.12.2015

вот полная функция (проверена и исправлена ​​для верхнего/нижнего регистра)

function getParameterByName (name) 
{
    name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
    var regexS = "[\\?&]" + name.toLowerCase() + "=([^&#]*)";
    var regex = new RegExp(regexS);
    var results = regex.exec(window.location.search.toLowerCase());
    if (results == null)
        return "";
    else
        return decodeURIComponent(results[1].replace(/\+/g, " "));
}
person Bishoy Hanna    schedule 12.09.2014

Следующее должно работать:

\?name=(.*?)&
person Karl Barker    schedule 12.04.2012
comment
Хм, это захватывает ?name=, и я просто хочу, что будет после name= и до & - person Trip; 12.04.2012
comment
@pst.. Я еще не мастер RegEx. :( Вы имеете в виду такие переменные, как $1 или $2? Я думаю, что этот пример возвращает только одну группу - person Trip; 12.04.2012

var myname = str.match(/\?name=([^&]+)&/)[1];

[1] потому, что вам, по-видимому, нужно значение группы (часть регулярного выражения в скобках).

var str = "/pages/new?name=reaojr&return_url=/page/new";
var matchobj = str.match(/\?name=([^&]+)&/)[1];
document.writeln(matchobj); // prints 'reaojr'
person Phil H    schedule 12.04.2012

Вот однострочный ответ, который предотвращает необходимость хранения переменной (если вы не можете использовать URLSearchParams, потому что вы все еще поддерживаете IE)

(document.location.search.match(/[?&]name=([^&]+)/)||[null,null])[1]

Добавив ||[null,null] и заключив его в круглые скобки, вы можете безопасно индексировать элемент 1 в массиве, не проверяя, вернулось ли совпадение с результатами. Конечно, вы можете заменить [null,null] на то, что хотите по умолчанию.

person HungryBeagle    schedule 19.06.2020

Это может сработать:

\??(.*=.+)*(&.*=.+)?
person Hisoka    schedule 27.05.2021
comment
Есть и другие ответы (и принятые), которые содержат вопрос ОП, и они были опубликованы некоторое время назад. При публикации ответа см. Как написать хороший ответ? убедитесь, что вы добавили новое решение , или существенно лучшее объяснение, особенно при ответе на старые вопросы. - person help-info.de; 27.05.2021

Вы можете получить тот же результат с помощью простого .split() в javascript.

пусть значение = url.split(name=)[1].split(&)[0];

person Nilesh Yadav    schedule 28.06.2021