2012-03-07 70 views
0

我想要做一個URL GET變量替換,但是檢查變量是否存在於其他GET變量中的正則表達式在我期待它返回時返回true假。正則表達式模式在URL上失敗GET參數

我使用的模式是:&sort=.*&

測試網址: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); 
    } 
} 

回答

1

我說得對不對相信,這種模式應該是基礎,他們是按照排序參數的值沒有符號字符上返回false?

好,您正在使用String.search,其中,根據所鏈接的文檔:

如果成功的話,搜索返回字符串中的正則表達式的索引。否則,它返回-1。

因此,當匹配時它將返回-10或更大。所以你應該測試-1,而不是真實性。

而且,沒有必要通過正則表達式爲字符串,你還不如用:

url.replace(/&sort=.*&/i,'&sort='+sort+'&'); 

此外,請記住,replace將創建一個新的字符串,而不是字符串替換(字符串在Javascript中是不可變的)。

最後,我不認爲需要搜索的字符串,然後替換它 - 它似乎你總是要替換&sort=SOMETHING&sort=SOMETHING_ELSE,所以才這樣做:

if(url.indexOf('?') == -1) { 
    url = url+'?sort='+sort; 
} else { 
    url = url.replace(/&sort=[^&]*/i, '&sort=' + sort); 
} 
+0

完美取代你的邪惡的正則表達式。感謝您的幫助Linus。 – Stibily 2012-03-07 15:10:34

0

的JavaScript字符串函數search()返回-1,如果沒有找到,不假。您的代碼應閱讀:

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); 
} 
0

你應檢查

if(url.search('/&sort=.*&/i') >= 0) 

那麼它應該工作

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 
0

這可以通過使用

url.replace(/([?&])(sort=)([^&?]*)/, "$1$2" + sort); 

比賽打破

第1場比賽的呢?或& 第2組匹配排序= 第3組匹配任何不是&或?

然後 「$ 1 $ 2」 +排序將替換所有3組與第2個+您的可變

使用字符串示例匹配 「替換」,而不是你排序變量

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" 
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);