2013-02-07 62 views
2

我在我的形式的地址欄,我想限制
* | \ " : < > [ ] { } \ () '' ; @ & $
我試圖與
正則表達式來限制特殊字符

var nospecial=/^[^* | \ " : < > [ ] { } ` \ () '' ; @ & $]+$/; 
      if(address.match(nospecial)){ 
       alert('Special characters like * | \ " : < > [ ] { } ` \ () \'\' ; @ & $ are not allowed'); 
       return false; 

,但它無法正常工作。請告訴我我錯過了什麼?

+0

在角色等級中'''逃跑 –

+0

@Juhana - 錯誤。注意'^'作爲這個類的第一個字符;這否定了比賽的意義。如果整個地址只有與該類中(剩餘)字符的_none_匹配的字符,它將匹配。 –

+0

@TedHopp哎呀,你是對的!雖然然後if子句是錯誤的,它給出了錯誤消息,如果正則表達式匹配... – JJJ

回答

4

您需要在角色類中隱藏右括號(以及反斜槓)。你也不需要所有的空間:

var nospecial=/^[^*|\":<>[\]{}`\\()';@&$]+$/; 

我擺脫了所有的空間;如果你想限制空格字符以及加一個空格回到

編輯作爲@fab在評論中指出,這將是更有效的扭轉正則表達式的意義:

var specials=/[*|\":<>[\]{}`\\()';@&$]/; 

並測試一個特殊字符(而不是不存在一個)的存在:

if (specials.test(address)) { /* bad address */ } 
+2

此外,更好的解決方案是*測試*針對單個不良字符:'if(/[*|and-so-on]/.test(address))alert('not allowed!');' –

+0

@fab - 爲什麼更好?我不認爲有任何性能方面的好處。在任何一種情況下,匹配都會查看每個字符,然後對該類進行測試,直到找到匹配項或字符串的結尾。另外,你的建議需要單獨的測試來排除一個空的地址字符串。 –

+0

@fab - 呃,我收回。很明顯,您的方法(至少在Chrome瀏覽器中)速度更快,至少根據[本測試](http://jsperf.com/character-class/)(即使是針對空字符串的額外測試)也是如此。我不能說爲什麼會這樣(除非JS引擎在我的多核PC上多線程匹配,這是完全可能的)。 –

0

使用以下函數

function checkSpcialChar(event){ 
    if(!((event.keyCode >= 65) && (event.keyCode <= 90) || (event.keyCode >= 97) && (event.keyCode <= 122) || (event.keyCode >= 48) && (event.keyCode <= 57))){ 
     event.returnValue = false; 
     return; 
    } 
    event.returnValue = true; 
}