Javascript Regex-正则表达式模式在URL GET参数上失败
我试图做一个URL GET变量替换,但是当我期望它返回false时,用于检查变量是否存在于其他GET变量中的正则表达式正在返回true 我使用的模式是: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
&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);
完美的谢谢你的帮助,莱纳斯。