Regex-正则表达式模式在URL GET参数上失败
Regex - Regular expression pattern failing on URL GET parameter
我正在尝试进行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);
}
}
我认为这个模式应该返回false,因为排序参数的值后面没有"与"字符,这是对的吗?
好吧,你正在使用String.search,根据链接的文档:
如果成功,搜索将返回字符串中正则表达式的索引。否则,返回-1。
因此,当存在匹配时,它将返回-1
或0
或更大值。所以你应该测试-1
,而不是真实性。
此外,不需要将正则表达式作为字符串传递,您还可以使用:
url.replace(/&sort=.*&/i,'&sort='+sort+'&');
此外,请记住replace
将创建一个新字符串,而不是在字符串中替换(Javascript中的字符串是不可变的)。
最后,我认为没有必要搜索字符串,然后替换它——似乎你总是想用&sort=SOMETHING_ELSE
替换&sort=SOMETHING
,所以只需要这样做:
if(url.indexOf('?') == -1) {
url = url+'?sort='+sort;
} else {
url = 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);
}
您应该检查
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);
这场比赛打破了
第1组匹配?或者&第2组匹配排序=第3组匹配任何不是&或
然后"$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
。这是因为CCD_ 15是贪婪的(试图尽可能多地匹配)。你可以通过附加一个来告诉它尽可能少地匹配来避免这种情况?如同CCD_ 16。
也就是说,我相信拥有一个知道URL实际工作方式的库可能会更好。你没有补偿参数位置、可能的转义值等。我建议你看看URI.js,用替换你的邪恶正则表达式
var uri = URI(document.URL),
data = uri.query(true);
data.foo = 'bazbaz';
uri.query(data);
- JS:执行'失败;getComputedStyle'在'窗口':参数的类型不是'
- 使用空媒体查询调用matchMedia失败,IE中的参数无效
- AngularFire 0.5美元移除.错误:Firebase.child失败:第一个参数是无效路径
- Jsonresult在我的Ajax调用中使用参数失败.为什么会发生这种事
- PageMethods调用使用1参数成功,但在2上失败(未知web方法)
- 1.js:23未捕获类型错误:执行'失败;appendChild'在'节点':参数1不是
- 为什么JavaScript函数在使用某些参数名称时会失败
- javascript / jQuery “insertAfter” 函数参数中的空格会导致失败
- Firebase 承诺 - Query.once 失败:使用 1 个参数调用.预计至少 2
- 当参数包含 html 标记时,Ajax 调用失败
- 角度 UI 路由器 - 在没有参数的情况下从一个状态转换到同一状态失败
- Firebase.update失败:第一个参数在属性中包含未定义的参数
- Regex-正则表达式模式在URL GET参数上失败
- 单击列表中的项目->查看详细信息但没有输出?Firebase.child失败:第一个参数是无效路径
- 当我传递参数时,从动态添加的html按钮调用javascript函数失败
- js中函数间传递参数失败
- 向javascript函数传递参数失败
- bind函数递归传递参数失败
- http get传递参数失败
- Web2py - ajax调用返回404或处理参数失败