在java脚本中使用正则表达式删除查询字符串

Removing a query string using regex in java script

本文关键字:正则表达式 删除 查询 字符串 java 脚本      更新时间:2023-09-26

我需要删除REST API调用附带的查询参数。下面是需要考虑的示例url。在每个URL中,我们需要删除'key'参数及其值。

  • /测试/v1 ?关键= keyval& param1 = value1& param2 = value2
  • /测试/v1吗?关键= keyval
  • /测试/v1 ? param1 = value1&关键= keyval
  • /测试/v1 ? param1 = value1&关键= keyval& param2 = value2

去掉key参数后,最终url应该如下所示:

  • /测试/v1 ? param1 = value1& param2 = value2
  • /测试/v1吗?
  • /测试/v1吗?param1 = value1
  • /测试/v1 ? param1 = value1 =, param2 = value2

我们使用下面的正则表达式来匹配和替换php中的查询字符串。(https://regex101.com/r/pK0dX3/1)

(& lt; =[?,;])关键=。* ? ($ | (,,))

我们不能在java脚本中使用相同的正则表达式。一旦我们在java脚本中使用它,它会给出一些语法错误。你能帮我们解决相同正则表达式的问题吗?我们如何改变这个正则表达式匹配和删除查询参数如上所述?

显然Javascript不支持向后看,因此你的正则表达式将无法工作。

在Javascript中你可以这样写:

repl = input.replace(/('?)key=[^&]*(?:&|$)|&key=[^&]*/gmi, '$1');

RegEx演示

Regex正在使用 Regex替换:

  1. 如果这个查询参数正好在?之后,那么我们在参数之后抓取&,并将?重新替换。
  2. 如果此查询参数位于&之后,则将&key=value替换为空字符串。

regex可以在PHP中工作,但不能在Javascript中工作,因为Javascript不支持向后看

这里最简单的修复方法是用捕获组([?&;])中的等效字符替换(?<=[?&;])后面的字符,并使用反向引用($1)将该位插入到替换字符串中。

例如:

var path = '/test/v1?key=keyval&param1=value1&param2=value2';
var regex = /([?&;])key=.*?($|[&;])/;
console.log(path.replace(regex, '$1'); // outputs '/test/v1?param1=value1&param2=value2'

不相信regex是删除查询参数最可靠的方式,但那是另一回事:-)

如果您不想使用正则表达式,这里有一个函数可以做到这一点:

var removeQueryString = function (str) {
    var qm = str.lastIndexOf('?');
    var path = str.substr(0, qm + 1);
    var querystr = str.substr(qm + 1);
    var params = querystr.split('&');
    var keyIndex = -1;
    for (var i = 0; i < params.length; i++) {
        if (params[i].indexOf("key=") === 0) {
            keyIndex = i;
            break;
        }
    }
    if (keyIndex != -1) {
        params.splice(keyIndex, 1);
    }
    var result = path + params.join('&');
    return result;
};

在javascript中不提供lookbehind功能,因此要在键/值之前测试字符,您必须匹配它。要使该模式在url的查询部分的任何位置都能工作,您可以在非捕获组中使用替换,并且捕获问号:

url = url.replace(/(?:&|('?))key=[^&#]*(?:(?!'1).)?/, '$1');

注意:#被排除在字符类之外,以防止url的片段部分(如果有的话)与键值匹配