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

时间:2012-03-07 14:10:11

标签: javascript regex

我正在尝试进行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);
    }
}

6 个答案:

答案 0 :(得分:1)

  

我是否有理由相信这种模式应该返回false,因为它们在sort参数的值之后没有符号?

嗯,您正在使用String.search,根据链接的文档:

  

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

因此,当匹配时,它会返回-10或更高版本。所以你应该测试-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);