繁体   English   中英

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

[英]Replace part of text in regex with javascript

我需要使用正则表达式更改我的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+就足够了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM