2010-09-04 49 views
0

我需要重寫使用JavaScript的查詢。 首先我檢查變量是否存在,如果是我想用新的搜索詞替換它。如果它不存在,那麼我剛纔添加的新的變量JavaScript的正則表達式 - 刪除查詢字符串變量,如果存在

我能夠得到它與像帽子深入淺出工作,UFC帽子 空格是20%,所以UFC的帽子確實是UFC%20hat

我遇到了像化妝,帽子球,咖啡&茶等條款問題。

這是什麼適當的正則表達式?

下面是我的代碼,這是行不通的。

var url = String(document.location).split('?'); 
querystring = url[1]; 
if(querystring.match(/gbn_keywords=/)!=null) 
querystring=querystring.replace(/gbn_keywords=[a-zA-Z0-9%20.]+/,"gbn_keywords="+term); 
else 
querystring=querystring+"&gbn_keywords="+term; 
+0

你可以通過'document.location.search'獲得 「查詢字符串」 了。你可能想使用'escape(term)'。 – 2010-09-04 21:36:27

回答

1

不需要正則表達式。要獲得查詢參數,請在?之後採取所有措施。然後,將字符串拆分爲&以返回每個參數。以=再次分開以獲得參數名稱(=的右側)和值(=的左側)。迭代每個參數,使用每個參數重新構建URL,排除不需要的參數。你不應該在這裏遇到問題,因爲?&-如果要在參數中使用,則必須轉義。如果找不到參數,你還說要添加參數,所以如果找到參數,只需在遍歷每個參數時設置一個變量爲true。如果您沒有將其追加到您重建的查詢字符串的末尾。

+0

好主意......我認爲這會讓我對查詢字符串有更多的控制,謝謝 – Matt 2010-09-04 22:01:54

0

爲什麼不在url[1]上運行拆分並將該新數組中的gbn_keywords的值替換?

如果您使用JavaScript框架,可能會有一個方便的功能來完成所有功能。在Prototype中有函數toQueryParams()

0

&字符用於分隔查詢字符串中的鍵和值對。這樣就可以通過重新編寫代碼如下,除了&所有字符匹配:

querystring=querystring.replace(/gbn_keywords=[^&]+/,"gbn_keywords="+term); 

[^ &] +匹配一個或多個字符,直到達到&或字符串的結尾。但是,如果有可能的情況下查詢字符串數據可能看起來像...... gbn_keywords =(沒有值),然後稍微修改需要上述線路:

querystring=querystring.replace(/gbn_keywords=[^&]*/,"gbn_keywords="+term); 

只要改變+爲*,這樣的正則表達式會匹配0個或更多字符。我認爲這樣更好。

1

location對象已經具有完美的性能,如pathnamehostname等,它可以爲您提供URL的單獨部分。使用.search屬性,而不是試圖將URL作爲字符串破解(?不僅可能出現在該位置)。

然後是&字符分裂的情況(如果您想變得更好,也可能是;),然後根據HTML4 B2.2檢查每個參數。對於一般情況,這需要正確的URL解碼,因爲g%62n_keywords=...是拼寫相同參數的有效方式。在出路時,你將需要再次編碼,以停止&繼續下一個參數(以及包含其他無效字符)。

這裏有幾個實用函數可以用來更容易地處理查詢字符串操作。它們在location.searchlink.search中查看的?...字符串和查詢Object將參數名稱映射到值數組(因爲form-url編碼的查詢可以具有相同參數的多個實例)之間進行轉換。

function queryToLookup(query) { 
    var lookup= {}; 
    var params= query.slice(1).split(/[&;]/); 
    for (var i= 0; i<params.length; i++) { 
     var ix= params[i].indexOf('='); 
     if (ix!==-1) { 
      var name= decodeURIComponent(params[i].slice(0, ix)); 
      var value= decodeURIComponent(params[i].slice(ix+1)); 
      if (!(name in lookup)) 
       lookup[name]= []; 
      lookup[name].push(value); 
     } 
    } 
    return lookup; 
} 

function lookupToQuery(lookup) { 
    var params= []; 
    for (var name in lookup) 
     for (var i= 0; i<lookup[name].length; i++) 
      params.push(encodeURIComponent(name)+'='+encodeURIComponent(lookup[name][i])); 
    return params.length===0? '' : '?'+params.join('&'); 
} 

這使得簡單的用法:

var lookup= queryToLookup(location.search); 
lookup['gbn_keywords']= ['coffee & tea']; 
var query= lookupToQuery(lookup); 
相關問題