用 javascript 替换正则表达式中的部分文本

Replace part of text in regex with javascript

本文关键字:文本 javascript 替换 正则表达式      更新时间:2023-09-26

我需要用正则表达式更改我的 URL。例如,我的网址如下所示:

http://domain.com/blog/?page=2&order=asc&by=date

使用javascript,我想动态地将order=asc更改为order=desc。但是这个函数也适用于任何属性,例如 by ,所以只order 不是办法。

这是函数:

function replace(url, attribute, value) {
    var pattern = new RegExp('(['?|'&])' + attribute + '=.'w+');
    var replacement = '$1' + attribute + '=' + value;
    return url.replace(pattern, '', url);
}

因此,在示例中,使用以下变量调用函数:

url = 'http://domain.com/blog/?page=2&order=asc&by=date'
attribute = 'order'
value = 'desc'

会返回http://domain.com/blog/?page=2&order=desc&by=date.

您可以使用 jQuery $.param函数的反向解析参数。

(function($) {
  $.unparam = function(value) {
    var params = {};
    var pieces = value.split('&');
    var pair, i, l;
    for (i = 0, l = pieces.length; i < l; i++) {
      pair = pieces[i].split('=', 2);
      params[decodeURIComponent(pair[0])] = (pair.length == 2 ?
        decodeURIComponent(pair[1].replace(/'+/g, ' ')) : true);
    }
    return params;
  };
}(jQuery));
var url = 'http://domain.com/blog/?page=2&order=asc&by=date';
$('<p>').text('Before: ' + url).appendTo('body');
var parts = url.split('?');
var base = parts[0];
var params = parts[1];
var data = $.unparam(params);
data.order = 'desc';
var newUrl = base + '?' + $.param(data);
$('<p>').text('After: ' + newUrl).appendTo('body');
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>


动态示例

(function($) {
  $.unparam = function(value) {
    var params = {};
    var pieces = value.split('&');
    for (var i = 0, l = pieces.length; i < l; i++) {
      var pair = pieces[i].split('=', 2);
      params[decodeURIComponent(pair[0])] = (pair.length == 2 ?
        decodeURIComponent(pair[1].replace(/'+/g, ' ')) : true);
    }
    return params;
  };
}(jQuery));
function updateParams(url, data) {
  var parts = url.split('?');
  var base = parts[0];
  var params = parts.length > 0 ? parts[1] : '';
  return base + '?' + $.param($.extend($.unparam(params), data));
}
var oldUrl = 'http://domain.com/blog/?page=2&order=asc&by=date';
var newUrl = updateParams(oldUrl, {
  order: 'desc'
});
$('<p>').text(newUrl).appendTo('body');
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

我通过更改您的正则表达式使您的示例正常工作:

new RegExp('(['?|'&])' + attribute + '=.'w+');

对此:

new RegExp('([?&])' + attribute + '=''w+');

曾经转义的'w+是一个问题,因为 JavaScript 字符串插值实际上是解释反斜杠本身,最终将其剥离并仅传递正则表达式一个"W"。 转义两次:''w+

也:

['?|'&]是一个字符类,不需要|交替(您现在实际上正在匹配管道符号),并且像?这样的特殊字符的量词通常在字符类中并不特殊,因此无需转义它们。

'w+之前你不需要.'w+就足够了。