使用正则表达式从查询字符串中捕获值?

IT技术 javascript regex query-string
2021-02-08 18:26:10

我正在尝试选择in之后name=和之前的内容&

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

到目前为止我有..

^name=(.*?).

在这种情况下,我试图返回J,但它是动态的,因此它可以有很多字符、字母或数字。

最终的情况是让我自己对replace正则表达式找到的这个动态变量做一个声明。

6个回答

/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提供了一种为其他浏览器检索值的本机方式。

显示您的其余代码。如果将其分配给数组,则该数组将包含匹配项,否则必须使用RegExp.$1
2021-03-15 18:26:10
这捕获了name=我想要的只是在之后name=和之前出现的内容&
2021-04-01 18:26:10
啊,对不起,vol7ron。:D 非常抱歉。我正在尝试更换。我会更新我的问题。
2021-04-01 18:26:10
@Trip:列出了如何分配的匹配示例。请注意,如果matches不匹配任何内容,它将为空。
2021-04-05 18:26:10
该功能可能有点矫枉过正,但如果您有重复的键(如name=J&name=K有效),则它是必要的即使只有一个,我仍然把它放在一个数组中,这样我就可以用同样的方式处理结果。for (var n=params['name'].length;n--){ /*... do something with params['name'][n] ... */ }仅当密钥根本不存在时才会失败的示例
2021-04-12 18:26:10

如果参数后面有散列,则接受的答案包括散列部分。正如@bishoy 在他的函数中所拥有的那样,正确的正则表达式是

/name=([^&#]*)/

改进以前的答案:

/**
 *
 * @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 

这是完整的功能(针对大写/小写进行了测试和修复)

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, " "));
}

以下应该工作:

\?name=(.*?)&
嗯,这捕捉到了?name=,我想要之后name=和之前会发生什么&
2021-04-04 18:26:10
@pst .. 我还不是 RegEx 大师。:(你的意思是像 $1 或 $2 这样的变量?我认为这个例子只返回一组
2021-04-04 18:26:10