【问题标题】:Capture value out of query string with regex?使用正则表达式从查询字符串中捕获值?
【发布时间】:2012-04-24 23:58:03
【问题描述】:

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

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

到目前为止我有..

^name=(.*?).

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

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

【问题讨论】:

标签: javascript regex query-string


【解决方案1】:

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

【讨论】:

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

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

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

【讨论】:

    【解决方案3】:

    改进之前的答案:

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

    【讨论】:

      【解决方案4】:

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

      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】:

        以下应该有效:

        \?name=(.*?)&
        

        【讨论】:

        • 嗯,这捕获了?name=,我只是想要name=之后和&之前会发生什么
        • @pst.. 我还不是 RegEx 大师。 :( 你的意思是像 $1 或 $2 这样的变量?我认为这个例子只返回一个组
        【解决方案6】:
        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'
        

        【讨论】:

          【解决方案7】:

          这是避免存储变量的单行答案(如果你不能使用 URLSearchParams,因为你仍然支持 IE)

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

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

          【讨论】:

            【解决方案8】:

            这可能有效:

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

            【讨论】:

            • 还有其他答案(和一个已接受的答案)提供了 OP 的问题,它们是前一段时间发布的。发布答案 see: How do I write a good answer? 时,请确保添加新的解决方案或更好的解释,尤其是在回答较老的问题时。
            【解决方案9】:

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

            让值 = url.split("name=")[1].split("&")[0];

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-08-20
              • 2023-01-17
              • 1970-01-01
              • 2019-10-10
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多