我正在尝试进行URL GET变量替换,但是当我期望它返回false时,用于检查变量是否存在于其他GET变量中的正则表达式返回true。
我使用的模式是:&sort=.*&
测试网址:http://localhost/search?location=any&sort=asc
我是否有理由相信这种模式应该返回false,因为它们在sort参数的值之后没有符号?
完整代码:
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);
}
}
答案 0 :(得分:1)
我是否有理由相信这种模式应该返回false,因为它们在sort参数的值之后没有符号?
嗯,您正在使用String.search,根据链接的文档:
如果成功,搜索将返回字符串中正则表达式的索引。否则,它返回-1。
因此,当匹配时,它会返回-1
或0
或更高版本。所以你应该测试-1
,而不是真实性。
此外,没有必要将正则表达式作为字符串传递,您也可以使用:
url.replace(/&sort=.*&/i,'&sort='+sort+'&');
此外,请记住replace
将创建一个新字符串,而不是在字符串中替换(Javascript中的字符串是不可变的)。
最后,我认为不需要搜索字符串,然后替换它 - 似乎您总是希望将&sort=SOMETHING
替换为&sort=SOMETHING_ELSE
,所以就这样做:< / p>
if(url.indexOf('?') == -1) {
url = url+'?sort='+sort;
} else {
url = url.replace(/&sort=[^&]*/i, '&sort=' + sort);
}
答案 1 :(得分:0)
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);
}
答案 2 :(得分:0)
你应该检查
if(url.search('/&sort=.*&/i') >= 0)
然后它应该工作
答案 3 :(得分: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
答案 4 :(得分:0)
这可以通过
来完成url.replace(/([?&])(sort=)([^&?]*)/, "$1$2" + sort);
比赛分解
第1组匹配?或者&amp; 第2组匹配sort = 第3组匹配任何不是&amp;还是?
然后“$ 1 $ 2”+ sort将用前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"
答案 5 :(得分:0)
你假设是正确的。但是在您的代码中,您将我使用的模式是:
&sort=.*&
测试网址: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实际工作方式的库。您没有补偿参数位置,可能的转义值等。我建议您查看URI.js并用
替换您的邪恶正则表达式var uri = URI(document.URL),
data = uri.query(true);
data.foo = 'bazbaz';
uri.query(data);