none
vb2008 電子郵件格式驗證問題 非asp.net RRS feed

  • 問題

  • 親愛的各位大大:
          請幫我看一下電子郵件格式驗證錯誤該如何修改:

     Dim EStr As String
     Dim ELen As Integer
     Dim I, FlagCount, TmpI, TmpJ As Integer
     TmpI = 0
     Const EFlag = "@"
     Const EPFlag = "."
     EStr = Trim(TextEmail.Text)
     ELen = Len(EStr)
     If Len(EStr) = 0 Then
            MsgBox("請输入您的Email!", vbCritical, "SD")
         Else
            For I = 1 To ELen
               If Mid(EStr, I, 1) = EFlag Then
                   FlagCount = FlagCount + 1
                    If FlagCount = 1 Then TmpI = I
                End If
                    If Mid(EStr, I, 1) = EPFlag Then TmpJ = I
                Next
                If Mid(EStr, 1, 1) = EFlag Or Mid(EStr, 1, 1) = EPFlag Then
                    MsgBox("您输入的Email格式錯誤,請重新输入!", vbCritical, "SD")
                ElseIf Mid(EStr, ELen, 1) = EFlag Or Mid(EStr, ELen, 1) = EPFlag Then
                    MsgBox("您输入的Email格式錯誤,請重新输入!", vbCritical, "SD")
                ElseIf FlagCount = 0 Then
                    MsgBox("您输入的Email格式錯誤,請重新输入!", vbCritical, "SD")
                ElseIf FlagCount > 1 Then
                    MsgBox("您输入的Email格式錯誤,請重新输入!", vbCritical, "SD")
                ElseIf Mid(EStr, TmpI - 1, 1) = EPFlag Or Mid(EStr, TmpI + 1, 1) = EPFlag Then
                    MsgBox("您输入的Email格式錯誤,請重新输入!", vbCritical, "SD")
                ElseIf Len(Mid(EStr, TmpJ, ELen - TmpJ)) = 0 Then
                    MsgBox("您输入的Email格式錯誤,請重新输入!", vbCritical, "SD")
                ElseIf Len(Mid(EStr, TmpJ, ELen - TmpJ)) = 1 Or Len(Mid(EStr, TmpJ, ELen - TmpJ)) > 3 Then
                    MsgBox("您输入的Email格式錯誤,請重新输入!", vbCritical, "SD")
                End If
            End If

    問題1:當我打入***@***就會出現引數Start必需大於0,請問要怎麼改?

    謝謝各位大大

    2010年3月2日 上午 02:05

解答

  • Hi!

    1. 請確認您的 Mid function 關於 Start 引數必須大於 0,以您的程式碼為例

                ElseIf Len(Mid(EStr, TmpJ, ELen - TmpJ)) = 0 Then
                    MsgBox("您输入的Email格式錯誤,請重新输入!", vbCritical, "SD")

    當您的 TmpJ = 0 時,就會出現 引數 Start 必需大於0,所以確認您的程式邏輯是否有問題

    另外,撰寫程式時建議您把註解打上,方便了解邏輯


    2. 也可以使用 Regex 處理

            ' 透過 Regex
            ' 小範例
            Dim regex As New System.Text.RegularExpressions.Regex("^(?("")("".+?""@)|(([0-9a-zA-Z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-zA-Z])@))(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,6}))$")
            If (regex.IsMatch(TextEmail.Text)) Then
                MessageBox.Show("正確")
            Else
                MessageBox.Show("錯誤")
            End If



    小歐ou是個菜鳥工程師,回答不好請不要標我的回覆為解答,有網友熱心回覆也請發問者儘快回應,謝謝
    歡迎參觀我的Blog.NET菜鳥自救會
    2010年3月2日 上午 02:24
    版主

所有回覆

  • Hi!

    1. 請確認您的 Mid function 關於 Start 引數必須大於 0,以您的程式碼為例

                ElseIf Len(Mid(EStr, TmpJ, ELen - TmpJ)) = 0 Then
                    MsgBox("您输入的Email格式錯誤,請重新输入!", vbCritical, "SD")

    當您的 TmpJ = 0 時,就會出現 引數 Start 必需大於0,所以確認您的程式邏輯是否有問題

    另外,撰寫程式時建議您把註解打上,方便了解邏輯


    2. 也可以使用 Regex 處理

            ' 透過 Regex
            ' 小範例
            Dim regex As New System.Text.RegularExpressions.Regex("^(?("")("".+?""@)|(([0-9a-zA-Z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-zA-Z])@))(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,6}))$")
            If (regex.IsMatch(TextEmail.Text)) Then
                MessageBox.Show("正確")
            Else
                MessageBox.Show("錯誤")
            End If



    小歐ou是個菜鳥工程師,回答不好請不要標我的回覆為解答,有網友熱心回覆也請發問者儘快回應,謝謝
    歡迎參觀我的Blog.NET菜鳥自救會
    2010年3月2日 上午 02:24
    版主
  • Hi,

    email 驗證可以透過Regular Expression來處理, 你可以參考下列連結:
    http://www.dreamincode.net/code/snippet1394.htm

    http://dotnetdud.blogspot.com/2008/06/vbnet-regular-expression-to-check-email.html


    微軟技術支援中心 CSS - http://www.dotblogs.com.tw/lolota
    2010年3月2日 上午 02:29
  • 1. 美中不足, 你雖然寫了 "錯誤訊息" 卻沒說在哪一行發生
    2. 應該是  ElseIf Len(Mid(EStr, TmpJ, ELen - TmpJ)) = 0 Then <--TmpJ=0 , 所以會有例外, 然而看不出來你有個 TmpJ初值
    3. 很簡單一個作法, 當你發現 Len(Mid(EStr, TmpJ, ELen - TmpJ)) = 0 這行出錯,就去找出這句的變數值, 用中斷點 or Messagebox都可以, 不就知道了錯誤在哪嗎 ?

    MSDN 文件庫很重要
    問題本身越具體, 越容易得到大家的回應
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    2010年3月2日 上午 02:40
    版主
  • 線上手冊就有確認電子郵件格式的範例:
    http://msdn.microsoft.com/zh-tw/library/01escwtf.aspx HOW TO:確認字串是否為有效的電子郵件格式


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年3月2日 下午 03:14