2011-09-06 30 views
2

我正在研究一個項目,目前無法有任何第三方JS庫(否則這將是一件輕而易舉的jQuery)。這個項目中的一件事是表單驗證。除了我的正則表達式的一些小問題外,我的工作還算順利。正則表達式 - 新的RegExp()全局搜索/替換字符串

我在文本字段的change()上觸發了一個驗證函數,所以如果你選中並出現錯誤,你會立即知道。用良好的數據標籤出來,你會立即知道。如果驗證失敗,我將錯誤類分配給父元素。如果您只驗證一次,此工作正常。如果你把測試失敗,錯誤類建立,例如,如果你失敗了驗證2X,你結了:

<p class=" error"> 

如果你失敗了3次,你會結束:

<p class=" error error"> 

如果驗證通過,我會調用下面的removeClass()函數。基本上,它看起來並不像我正在進行全球搜索/替換。我確信添加全局修飾符會照顧上面的情況,但它不會,它只會刪除一個「錯誤」類。

removeClass: function (el, name) { 
    var regex = new RegExp('(^|\\s)' + name + '(\\s|$)', 'gi'); 
    el.className = el.className.replace(regex, ' '); 
} 

我的正則表達式只是找線或白空間,其次是「錯誤」的開頭,後面緊跟空白或行結束。當然,我承認吸吮正則表達式:)

任何東西都跳出來了嗎?

回答

3

它在全球範圍內工作,但是當找到匹配項時,下一次嘗試的匹配從前一匹配中最後一個字符後面的字符開始,即第二個error中的e,而不是前面的空格。

// v-----v-------first match 
    " error error" 
//   ^------continues here, no more matches because 
//      there isn't a space before `e`. 

爲了測試它,在兩個類之間添加第二個空格,它將起作用。

// v-----v-------first match 
    " error error" 
//   ^------continues here, and now it will match 

修復程序是使用\\b代替,這不符合任何字符,所以下一場比賽將在以前error比賽的最後一個字符r後開始。

new RegExp('\\b' + name + '\\b', 'gi'); 

正如@Joseph指出,應以避免的空格字符積累在.replace()" "更改爲空字符串""

+1

我比我更喜歡這個。 :P有一點值得注意的是,在這個例子中,你希望用空字符串('「」')替換,而不是在代碼後面的部分用空格。 –

+0

@約瑟夫:好點。否則,如果多次添加和移除類,空間會累積。 – user113716

+0

如果您在該元素上有其他類名稱,該怎麼辦? –