2011-08-23 62 views
-1

我試圖阻止用戶在輸入電子郵件地址時輸入無效字符。我是不是試圖驗證整個值(後面會發生)。使用javascript&jquery驗證按鍵上的電子郵件地址

我 「認爲」 這是爲了防止一組字符(如#或$)的正確方法是:

/[[email protected]]^[$#<>?]/ 

這部分工作:

/[[email protected]]/ 

這部分失敗:

/^[$#<>?]/ 

有什麼想法?

+2

根據規範,如果引用正確的電子郵件地址,則允許任何字符。此代碼將阻止具有有效電子郵件地址的用戶。 –

+0

您的正則表達式需要比正確驗證電子郵件地址更復雜一點:http://www.ex-parrot.com/pdw/Mail-RFC822-Address.html – Graham

+0

@格拉漢姆謝謝。但是,我並沒有試圖驗證文本是否爲整體(稍後會發生)。 –

回答

0

FIXED:
問題是一些KEYNUM值與不期望的字符發生碰撞。這固定它!

// ********************** 
// .emailOnly 
// Use - 
// Makes the element email-only. 
// 
// Example - 
// $('.myElement').emailOnly(); 
// ********************** 
(function($) { 
    $.fn.extend({ 
     emailOnly: function() { 
      return this.each(function() { 
       return $(this).keypress(function(e, text) { 

        var keynum; 
        var keychar; 
        var regEx; 
        var allowedKeyNums = [8, 9, 35, 36, 46]; // Backspace, Tab, End, Home, (Delete & period) 

        if (window.event) // IE 
         keynum = e.keyCode; 
        else if (e.which) // Netscape/Firefox/Opera 
         keynum = e.which; 
        else 
         keynum = e.keyCode 

        keychar = String.fromCharCode(keynum); 
        regEx = /[^$#<>?]/ // Undesirable characters 

        // Test for keynum values that collide with undesirable characters 
        if ($.inArray(keynum, allowedKeyNums) > -1) 
         return regEx.test(keychar); 

        regEx = /[[email protected]]/ 
        return regEx.test(keychar); 
       }); 
      }); 
     } 
    }); 
})(jQuery); 
5

嘗試用/[^$#<>?]/代替。

^裏面和在開幕式後直接使班級消極。

您可以瞭解更多有關這對regular-expressions.info

或者更好的,繼承人workign簡單的regex,做它,使用你作爲一個開始。

http://jsfiddle.net/hG99U/1/

+0

如上所述,克拉'^'需要進入方括號,如果你只是想防止無效字符,就不需要'[A-Z0-9a-z @]'(這是無論如何,電子郵件的有效字符不完整列表) – steveax

+0

奇怪的是,使用regEx =/[A-Z0-9a-z @] [^ $#<>?] /仍允許#$傳遞? –

+0

是啊看,你是正則表達式不包括中繼器,並且不檢查@應該在哪裏,或者至少應該有一個點+ tld結尾:http://jsfiddle.net/hG99U/1/ – sg3s

1

你不需要寫所有的特殊字符爲正則表達式需要被禁止的,因爲會有一個大名單,簡單寫了允許的那些,因爲它們不太(你已經完成了,可能只剩下一兩個字符,即DOT,UnderScore)。

你用來測試輸入字符的有效性的代碼已經很好了,這將驗證字符只能在[[email protected]]之外,可能你可以爲其他兩個字符設置[[email protected]\._]

keychar = String.fromCharCode(keynum); 
regEx = /[[email protected]]/; 
return regEx.test(keychar); 
+0

非常感謝。然而,奇怪的是,#$字符仍然通過? –

+0

這是完美的工作,嘗試在瀏覽器的地址欄中直接輸入'javascript:alert(/ [A-Z0-9a-z @] /。test(「$」));'會得到錯誤信息。問題出現在你的測試代碼'regEx.test(keychar)'中,嘗試糾正它,首先嚐試直接'return/[A-Z0-9a-z @] /。test(「$」);'代替它。 – teenup

+0

Puneet嘗試在瀏覽器中輸入'javascript:alert(/ [A-Z0-9a-z @] /。test(「ascacasc $」));'以理解問題(它應該是錯誤的,因爲它具有不合法的字符) – sg3s

1
<script type="text/javascript"> 
<!-- 
var email='[email protected]_' 
var bksp = 'backspace' 
var alt = 'alt' 


function alpha(e,allow) { 
var k; 
k=document.all?parseInt(e.keyCode): parseInt(e.which); 
return (allow.indexOf(String.fromCharCode(k))!=-1); 
} 

// --> 
</script> 


<input type="text" onkeypress="return alpha(event,email+bksp+alt)" /> 
1
$('input[type=email]').on('keypress', function (e) { 
    var re = /[[email protected]\._]/.test(e.key); 
    if (!re) { 
     return false; 
    } 
}); 
+3

你可以加一些解釋請 –

+0

它適合我 –

+0

雖然這段代碼可以解決這個問題,[包括說明]( http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)如何以及爲什麼解決這個問題真的有助於提高你的帖子的質量。請記住,你正在爲將來的讀者回答這個問題,而不僅僅是現在問的人!請編輯您的答案以添加解釋,並指出適用的限制和假設。 – Makyen