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

时间:2012-04-12 15:37:13

标签: javascript regex query-string

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

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

到目前为止,我有......

^name=(.*?).

我想在这种情况下返回,只是J,但它的动态因此它可以包含多个字符,字母或数字。

最终案例的情况是允许自己对正则表达式找到的这个动态变量做一个replace语句。

9 个答案:

答案 0 :(得分:55)

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

答案 1 :(得分:7)

改进以前的答案:

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

答案 2 :(得分:5)

如果在params之后有一个哈希,则接受的答案包括哈希部分。正如@bishoy的功能一样,正确的正则表达式将是

xmi

答案 3 :(得分:3)

以下内容应该有效:

\?name=(.*?)&

答案 4 :(得分:3)

这里是完整的功能(测试并固定为大/小写)

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

答案 5 :(得分:1)

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'

答案 6 :(得分:1)

这是一个单行答案,可避免必须存储变量(如果由于仍然支持IE而无法使用URLSearchParams)

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

通过添加||[null,null]并将其括在括号中,您可以安全地为数组中的项目1编制索引,而不必检查结果是否返回匹配项。当然,您可以将[null,null]替换为默认值。

答案 7 :(得分:0)

这可能有效:

\??(.*=.+)*(&.*=.+)?

答案 8 :(得分:0)

您可以使用简单的 .split() 在 javascript 中获得相同的结果

let value = url.split("name=")[1].split("&")[0];