2015-09-08 77 views
0

我試圖從查詢字符串中刪除一個變量。這是我目前的做法:JavaScript正則表達式從查詢中刪除變量

var str = "http://example.com/tal.php?sec=16&name=xxxx&size=xxxx"; 
str = str.replace(/([&])name=.*?(&|$)/g,""); 

有兩個問題與此代碼:

  • 無論是在&名稱的開頭和結尾移除。我只想要刪除一個

  • 當變量名稱位於查詢字符串的開頭或結尾時,它也應該起作用。

如何才能告訴正則表達式刪除第二個&只有當它匹配第一個?

回答

2

我建議使用捕獲組,然後使用他們在回調函數重新插入適當的&字符:

([?&])name=.*?($|&) 

demo

下面是一段JavaScript代碼顯示在更換過程中的所有3個位置:

function removeQueryArg(str) { 
 
    var re = /([?&])name=.*?($|&)/; 
 
    return str.replace(re, function(m, grp1, grp2, offset, input) { 
 
    return grp1 === "?" ? "?" : (grp2 === "&" ? "&" : ""); 
 
    }); 
 
} 
 

 
document.write(removeQueryArg('http://example.com/tal.php?name=xxxx&sec=16&size=xxxx') + "<br/>" + 
 
    removeQueryArg('http://example.com/tal.php?sec=16&name=xxxx&size=xxxx') + "<br/>" + 
 
    removeQueryArg('http://example.com/tal.php?sec=16&size=xxxx&name=xxxx'));

讓我解釋:

  • ([?&])name=.*?($|&)正則表達式中包含2個捕獲組([?&])(匹配任一?&)和($|&)(匹配字符串或&的終點)。
  • replace方法中,我們可以將這些組的內容傳遞給回調函數,我們可以進一步分析如何處理替換。
  • function(m, grp1, grp2, offset, input)實際上使用了整個比賽mgrp1grp2是捕獲的文本。 offset(原始字符串中的匹配索引)和input(整個輸入字符串)在此處未使用,但它們可能在某一天有用。
  • 在回調中,我檢查組1是否等於「?」。如果是,則參數位於查詢字符串的開頭,我們需要恢復前面的?
  • 如果不是,我們需要檢查第二組的內容。如果它等於&,則匹配位於查詢字符串的中間,我們需要添加&。如果沒有,我們到最後,不要添加任何東西,我們刪除整個比賽。

查看更多在Specifying a function as a parameter at MDN replace method help page

+0

我做了一個修正,因爲我真的不希望以匹配第一個,這種變化之後,如果你把變量 「?」作爲查詢字符串的第一個,它不匹配... – Vandervals

+0

沒錯,所有這些都可以通過在回調函數中捕獲組和邏輯來解決。請檢查更新後的答案。 –

+0

看起來不錯你不知道你給替換的功能在做什麼... – Vandervals

1

解決此問題的一種簡單方法是刪除name參數以及之前的問號或與號。如果問號被刪除,請將第一個&符號替換爲問號再將其放回。

s = s.replace(/([?&]name=[^&]*)/, ''); 
if (s.indexOf('?') == -1) { 
    s = s.replace(/[&]/, '?'); 
} 

示範:

function print(s) { 
 
    document.write(s + '<br \>'); 
 
} 
 

 
function deleteName(s) { 
 
    print(s); 
 
    s = s.replace(/([?&]name=[^&]*)/, ''); 
 
    if (s.indexOf('?') == -1) { 
 
    s = s.replace(/[&]/, '?'); 
 
    } 
 
    print(s); 
 
    print(''); 
 
} 
 

 
deleteName('http://example.com/tal.php?name=xxxx&sec=16&size=xxxx'); 
 

 
deleteName('http://example.com/tal.php?sec=16&name=xxxx&size=xxxx'); 
 

 
deleteName('http://example.com/tal.php?sec=16&size=xxxx&name=xxxx');
body { 
 
    font-family: sans-serif; 
 
}

+0

是的,基本上,這是一個類似的解決方案,但使用2個正則表達式替換,而不是一個。 –

+0

'
'是一個有效的標籤。 –