在Javascript中使用正则表达式返回URL参数值

在Javascript中使用正则表达式返回URL参数值,javascript,regex,url,parameters,Javascript,Regex,Url,Parameters,在寻找返回url参数值的方法时,我遇到了以下代码 参考: 我设法用这段代码实现了我想做的事情,但是我不理解它。我试着在各种regex实用程序网站上打孔,但是 不走运。我也不明白“函数(a、键、值)”这一部分。请解释此代码如何返回url参数值⚠️ 您的问题的答案如下,但请注意,2019年您可能不应该使用此代码。请参阅我答案的结尾,以获得更好的解决方案。⚠️ 很好地演示了此正则表达式将匹配什么: 在英语中,您可以这样读: 一个或多个?或&字符,后跟 第1组:一个或多个不是=或&的字符,后跟 一个=

在寻找返回url参数值的方法时,我遇到了以下代码

参考:

我设法用这段代码实现了我想做的事情,但是我不理解它。我试着在各种regex实用程序网站上打孔,但是 不走运。我也不明白“函数(a、键、值)”这一部分。请解释此代码如何返回url参数值

⚠️ 您的问题的答案如下,但请注意,2019年您可能不应该使用此代码。请参阅我答案的结尾,以获得更好的解决方案。⚠️ 很好地演示了此正则表达式将匹配什么:

在英语中,您可以这样读:

  • 一个或多个
    &
    字符,后跟
  • 第1组:一个或多个不是
    =
    &
    的字符,后跟
  • 一个
    =
    ,后跟
  • 第2组:零个或多个非
    &
  • 组#1捕获参数名称,组#2捕获其值

    至于传递给
    replace
    的回调函数(
    function(a,key,value){…
    ),让我们询问MDN:

    您可以指定一个函数作为第二个参数。在这种情况下,将在执行匹配后调用该函数。函数的结果(返回值)将用作替换字符串…请注意,如果第一个参数中的正则表达式是全局的,则对于要替换的每个完整匹配,将多次调用该函数

    函数的参数如下所示:

    • 匹配
      –匹配的子字符串
    • p1,p2,…
      –括号中的捕获组找到的第n个字符串,前提是
      replace()
      的第一个参数是
      RegExp
      对象
    (来源:)

    (我省略了其余部分,因为它与我们的问题无关。)

    这告诉我们,对于每个匹配,即字符串中的每个参数名称-值对,都会调用该函数,并且第二个参数(
    p1
    ,或代码中的
    key
    )包含由组1捕获的字符串,第三个参数(
    p2
    /
    value
    )包含由组2捕获的字符串

    您发现的代码实际上使用了
    replace
    来消除其副作用:这是一种非常简单的方法,可以迭代字符串中的所有匹配项


    更好的方法 正如您链接到的博客文章中所述,如果您针对的是当前浏览器,那么您应该使用手动解析查询字符串,而不是手动解析查询字符串,这正是出于此目的:

    constquery='?foo=1&bar=2';
    const searchParams=新的URLSearchParams(查询);
    //获取特定参数
    const foo=searchParams.get('foo');
    log('got foo:',foo);
    //迭代所有参数
    searchParams.forEach((val,key)=>console.log(key'is',val));
    ⚠️ 下面是您问题的答案,但请注意,2019年您可能不应该使用此代码。有关更好的解决方案,请参阅我答案的末尾。⚠️ 很好地演示了此正则表达式将匹配什么:

    在英语中,您可以这样读:

  • 一个或多个
    &
    字符,后跟
  • 第1组:一个或多个不是
    =
    &
    的字符,后跟
  • 一个
    =
    ,后跟
  • 第2组:零个或多个非
    &
  • 组#1捕获参数名称,组#2捕获其值

    至于传递给
    replace
    的回调函数(
    function(a,key,value){…
    ),让我们询问MDN:

    您可以指定一个函数作为第二个参数。在这种情况下,将在执行匹配后调用该函数。函数的结果(返回值)将用作替换字符串…请注意,如果第一个参数中的正则表达式是全局的,则对于要替换的每个完整匹配,将多次调用该函数

    函数的参数如下所示:

    • 匹配
      –匹配的子字符串
    • p1,p2,…
      –括号中的捕获组找到的第n个字符串,前提是
      replace()
      的第一个参数是
      RegExp
      对象
    (来源:)

    (我省略了其余部分,因为它与我们的问题无关。)

    这告诉我们,对于每个匹配,即字符串中的每个参数名称-值对,都会调用该函数,并且第二个参数(
    p1
    ,或代码中的
    key
    )包含由组1捕获的字符串,第三个参数(
    p2
    /
    value
    )包含由组2捕获的字符串

    您发现的代码实际上使用了
    replace
    来消除其副作用:这是一种非常简单的方法,可以迭代字符串中的所有匹配项


    更好的方法 正如您链接到的博客文章中所述,如果您针对的是当前浏览器,那么您应该使用手动解析查询字符串,而不是手动解析查询字符串,这正是出于此目的:

    constquery='?foo=1&bar=2';
    const searchParams=新的URLSearchParams(查询);
    //获取特定参数
    const foo=searchParams.get('foo');
    log('got foo:',foo);
    //迭代所有参数
    searchParams.forEach((val,key)=>console.log(key,'is',val));
    你看了这个吗?嗨,是的var str=“Hi android”;var rep=str.replace(“Hi”,“hello”)和Hi变为hello。我试图将这个概念应用到上面的代码中,但我不明白,因为“函数(a,key,value)”阅读了我给出的描述
    function getUrlParts(href) {
        var partsSet = {};
        var parts = href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(a,key,value) {
            partsSet[key] = value;
        });
        return partsSet;
    }