Javascript Regex-正则表达式模式在URL GET参数上失败

Javascript Regex-正则表达式模式在URL GET参数上失败,javascript,regex,Javascript,Regex,我试图做一个URL GET变量替换,但是当我期望它返回false时,用于检查变量是否存在于其他GET变量中的正则表达式正在返回true 我使用的模式是:&sort=.& 测试URL:http://localhost/search?location=any&sort=asc 基于排序参数的值后面没有符号和字符,我认为这个模式应该返回false,对吗 完整代码: var sort = getOptionValue($(this).attr('id')); var url = document.URL

我试图做一个URL GET变量替换,但是当我期望它返回false时,用于检查变量是否存在于其他GET变量中的正则表达式正在返回true

我使用的模式是:
&sort=.&

测试URL:
http://localhost/search?location=any&sort=asc

基于排序参数的值后面没有符号和字符,我认为这个模式应该返回false,对吗

完整代码:

var sort = getOptionValue($(this).attr('id'));
var url = document.URL;

if(url.indexOf('?') == -1) {
    url = url+'?sort='+sort;
} else {
    if(url.search('/&sort=.*&/i')) {
        url.replace('/&sort=.*&/i','&sort='+sort+'&');
    }
    else if(url.search('/&sort=.*/i')) {
        url.replace('/&sort=.*/i','&sort='+sort);
    }
}

javascript字符串函数
search()
如果未找到,则返回-1,而不是false。您的代码应为:

if(url.search('/&sort=.*&/i') != -1) {
    url.replace('/&sort=.*&/i','&sort='+sort+'&');
}
else if(url.search('/&sort=.*/i') != -1) {
    url.replace('/&sort=.*/i','&sort='+sort);
}
基于排序参数的值后面没有符号和字符,我认为这个模式应该返回false,对吗

那么,您正在使用,根据链接的文档:

如果搜索成功,则返回字符串中正则表达式的索引。否则,它返回-1

因此,当存在匹配时,它将返回
-1
,或
0
或更大。所以你应该测试
-1
,而不是真实性

此外,不需要将正则表达式作为字符串传递,您还可以使用:

url.replace(/&sort=.*&/i,'&sort='+sort+'&');
此外,请记住,
replace
将创建一个新字符串,而不是字符串中的replace(Javascript中的字符串是不可变的)

最后,我不认为需要搜索字符串,然后替换它——似乎您总是想用
&sort=SOMETHING
替换
&sort=SOMETHING\u other
,所以只需这样做:

if(url.indexOf('?') == -1) {
    url = url+'?sort='+sort;
} else {
    url = url.replace(/&sort=[^&]*/i, '&sort=' + sort);
}
你应该检查一下

if(url.search('/&sort=.*&/i') >= 0) 

然后它就可以工作了。你可以使用这个代码

var url = 'http://localhost/search?location=any&sort=asc';
var vars = {};
  var parts = url.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) {
        vars[key] = value;
    });
console.log(vars);
//vars is an object with two properties: location and sort

这可以通过使用

url.replace(/([?&])(sort=)([^&?]*)/, "$1$2" + sort);
比赛失败了

第一组的比赛是什么?或& 第2组匹配排序= 第3组匹配任何非a&或

然后“$1$2”+排序将用前2+变量替换所有3个组匹配项

使用字符串“REPLACE”代替排序变量的示例

url = "http://localhost/search?location=any&sort=asc&a=z"
url.replace(/([?&])(sort=)([^&?]*)/, "$1$2" + "REPLACE");
// => "http://localhost/search?location=any&sort=REPLACE&a=z"

url = "http://localhost/search?location=any&sort=asc"
url.replace(/([?&])(sort=)([^&?]*)/, "$1$2" + "REPLACE");
// => "http://localhost/search?location=any&sort=REPLACE"

url = "http://localhost/search?sort=asc"
url.replace(/([?&])(sort=)([^&?]*)/, "$1$2" + "REPLACE");
// => "http://localhost/search?sort=REPLACE"

url = "http://localhost/search?sort=asc&z=y"
url.replace(/([?&])(sort=)([^&?]*)/, "$1$2" + "REPLACE");
// => "http://localhost/search?sort=REPLACE&z=y"
我使用的模式是:
&sort=.*&
测试URL:
http://localhost/search?location=any&sort=asc
我认为这个模式应该返回到错误,对吗 其依据是排序后没有符号和字符 参数的值

你想当然了。但是在您的代码中有
else if(url.search('/&sort=.*/i')
,它将匹配并仍然替换该值

您还应该注意,您的代码将变成
http://localhost/search?sort=asc&location=any&some=more
进入
http://localhost/search?sort=asc&some=more
。这是因为
*
是贪婪的(试图尽可能多地匹配)。您可以通过添加一个?像这样
*?

这就是说,我相信你最好有一个知道URL实际工作原理的库。您没有对参数位置、可能的转义值等进行补偿。我建议您查看一下并用

var uri = URI(document.URL), 
    data = uri.query(true); 

data.foo = 'bazbaz'; 
uri.query(data); 

完美的谢谢你的帮助,莱纳斯。