2017-09-01 59 views
2

我想用正則表達式去掉一個url中的特定參數。正則表達式去除部分URL參數

//Here are the scenarios of what I want to remove in the url 
'?pIds=123,2311' => '' 
'?pIds=123,2311&deal=true' => '?deals=true' 
'?pIds=123' => '' 
'?pIds=123&deals=true' => '?deals=true' 

'&pIds=123,2311' => '' 
'&pIds=123,2311&deals=true' => '&deals=true' 
'&pIds=123' => '' 
'&pIds=123&deals=true' => '&deals=true' 


const a = '?pIds=123,2311&deals=true'; 
a.replace(/&?pIds=\d+,?\d+/i, ''); 

這是可能爲這些場景創建一個正則表達式嗎?我怎樣纔能有條件地擁有?或&那裏如果pIds分別是第一個或中間參數?

+0

我會建議的查詢字符串解析出成一個漂亮的地圖/字典結構,刪除不需要的密鑰,然後重新創建查詢字符串。 –

回答

2

您可以在JavaScript中使用這個正則表達式搜索:

/[?&]pIds=[^&]*$|([?&])pIds=[^&]*&/ 

正則表達式破碎:

  • [?&]pIds=[^&]*$:比賽之後pIds=?&$確保這是查詢字符串中唯一的參數。
  • |:或
  • ([?&])pIds=[^&]*&:比賽?&隨後pIds=其次&。查詢字符串中有多個參數時就是這種情況。

代碼:

var arr=['?pIds=123,2311', 
 
'?pIds=123,2311&deal=true', 
 
'?pIds=123', 
 
'?pIds=123&deals=true', 
 
'&pIds=123,2311', 
 
'&pIds=123,2311&deals=true', 
 
'&pIds=123', 
 
'&pIds=123&deals=true']; 
 

 
var re = /[?&]pIds=[^&]*$|([?&])pIds=[^&]*&/; 
 

 
for (i=0; i<arr.length; i++) { 
 
    console.log(arr[i], ' => ', arr[i].replace(re, '$1')); 
 
}

RegEx Demo

+1

你的解決方案效果很好!你能解釋'$ 1'是否取代了匹配正則表達式? – PBandJen

+0

另外,爲什麼在正則表達式的第一部分需要換行符? – PBandJen

+0

'\ n'在正則表達式中並不是真正需要的。它僅用於regex101演示,因爲在單獨的行中有多個輸入。 '$ 1'表示第一個捕獲組,即在交替的右邊的'([?&])'。 – anubhava

2

,以確定你所談論的塊中的正則表達式是類似以下內容:

((?<=\?)|\&)pIds=\d+(,\d+)? 

第一部分是一個「積極的回顧後發」的一個問號,如果有一個問號,這將匹配在pIds之前,但不包括問號作爲匹配的一部分。和號也可以工作,但它包含在匹配中,所以它會被刪除。

我也對可選的逗號和數字做了一些處理。你總是有一個數字塊(\d+),可選的後跟一個逗號和另一個數字塊。

編輯:在我原來的文章中,我忘了正確對待&符號。如果字符串以問號開頭,並且沒有「&」號,則要刪除該問號。如果它以問號開頭並以&符號結尾,則希望在末尾刪除&符號。如果它以「&」符號開頭和結尾,則需要刪除其中的一個。如果以「&」符號開頭,並且不以一個結尾,則需要在開頭刪除該符號。其結果是稍微複雜和看起來像這樣:

\?pIds=\d+(,\d+)?($|[^&])|(?<=\?)pIds=\d+(,\d+)?\&|\&pIds=\d+(,\d+) 

第一情況下,在端照顧無符號的(($|[^&])對應於任一端的行或無符號)。第二種情況照顧以?開始並以&結束。第三種情況處理剩餘的兩種情況,其中一開始有&

1

有辦法做到這一點的負載。這裏是沒有正則表達式的一個版本:

let url1 = 'foo.bar?pIds=123,2311&deals=true&foo=bar'; 
 
let parsedUrl; 
 
let queryParts; 
 

 
// Get the query string from the URL 
 
parsedUrl = url1.split('?'); 
 

 
// Split the query string so we get each key value then filter so we dont get the pIds 
 
queryParts = parsedUrl[1].split('&').filter(q => q.indexOf('pIds') === -1); 
 

 
// set URL to the original hostname and a ? if we have a query still 
 
url1 = (queryParts.length > 0 ? '?' : '') 
 

 
// Join the query parts 
 
url1 += queryParts.join('&') 
 

 
console.log(url1);

更多的例子:

let url2 = 'foo.bar?pIds=123,2311'; 
 
    parsedUrl = url2.split('?'); 
 
    queryParts = parsedUrl[1].split('&').filter(q => q.indexOf('pIds') === -1); 
 
    url2 = parsedUrl[0] + (queryParts.length > 0 ? '?' : '') 
 
    url2 += queryParts.join('&') 
 
    console.log(url2); 
 

 
    let url3 = 'foo.bar?foo=bar&pIds=123,2311'; 
 
    parsedUrl = url3.split('?'); 
 
    queryParts = parsedUrl[1].split('&').filter(q => q.indexOf('pIds') === -1); 
 
    url3 = parsedUrl[0] + (queryParts.length > 0 ? '?' : '') 
 
    url3 += queryParts.join('&') 
 
    console.log(url3);