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

Regex - Regular expression pattern failing on URL GET parameter

本文关键字:参数 失败 GET URL 正则表达式 模式 Regex-      更新时间:2023-09-26

我正在尝试进行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。

因此,当存在匹配时,它将返回-10或更大值。所以你应该测试-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);