如何使用Regex替换URL中的查询参数?

时间:2015-07-26 21:23:25

标签: javascript regex

我必须使用正则表达式将函数adjustUrlParameter(url,param)替换或追加到url。如果URL中存在相同的查询,则应使用param替换查询(即ID = 501应在google.com?ID=200中替换ID = 200)。如果不存在查询,则应该只将查询附加到URL的末尾。最后,如果查询确实存在但属性不同,则应附加查询并使用“&”将其与预先存在的查询分开。这是一个例子:

adjustUrlParameter('google.com?ID=501', 'TYPE=444') // => 'google.com?ID=501&TYPE=444'

我的代码没有替换相同的查询类型。它返回'google.com?ID=501&ID=200'而不是返回'google.com?ID=200'。这是我的代码:

var adjustUrlParameter = function(url, param) {
  var urlQuery = url.match(/\w+\W+/g);
  for (var i = 0; i < urlQuery.length; i++) {
    if (param === urlQuery[i]) {
        return url.replace(/\?.+$/, '?' + param);
    }
  }

  if (url.match(/\?/)) {
    return url + "&" + param;
  } else {
    return url + "?" + param;
  }

};

如何获取adjustUrlParameter('google.com?ID = 501','ID = 201')以返回正确的结果('google.com?ID=201')?

2 个答案:

答案 0 :(得分:1)

问题是if语句永远不会返回true。在for循环中放入一些console.log并观察它。你会看到urlQuery [i]何时返回&#34; ID =&#34; param返回&#34; ID = 444&#34;。他们不平等。

console.log("parameter:"+param); //parameter:ID=444
console.log("url_query: "+urlQuery[i]); //url_query: ID=

如果你改变你的for循环,它会用相同的类型替换查询参数:

  for (var i = 0; i < urlQuery.length; i++) {
    console.log("parameter:"+param);
    console.log("url_query: "+urlQuery[i]);
    var paramType = param.split("="); 
    console.log("paramType"+paramType); 
    var tmp = paramType[0]+"="; //since urlQuery[i] always has a character at the end
    console.log(tmp);
    if (tmp === urlQuery[i]) {
        return url.replace(/\?.+$/, '?' + param);
    }
  }

当您运行adjustUrlParameter('google.com?ID=501', 'ID=444')时,输出为"google.com?ID=444"

答案 1 :(得分:0)

您想要比较查询的名称,而不是它们包含的值。 假设您将id=200作为param传递,您希望在现有id中找到并替换url。这意味着我们不关心id的价值。如果是这种情况,我们可以按?&进行拆分,以获取所有查询的列表。我们开始在2循环,因为01是基础url?。我们还会在每次迭代时跳转2以跳过前面的&。最后,我们确保将每个query=分开并使用[0]或前半部分来获取我们关注的名称。

你可以这样做:

var adjustUrlParameter = function(url, param) {
    var urlQuery = url.split(/(\?|\&)/)
    ,   thisQuery = param.split(/\=/)[0]
    for (var i = 2; i < urlQuery.length; i = i + 2) {
        if (thisQuery === urlQuery[i].split(/\=/)[0]) {
            return url.replace(/(\?|\&).*$/, '?' + param);
        }
    }

    if (url.match(/\?/)) {
        return url + "&" + param;
    } else {
        return url + "?" + param;
    }

};