检查电子邮件地址是否包含不允许的字符

Check if email address contains not allowed characters

我正在使用 VBA“Asc”函数来 return 电子邮件地址中每个字符的 ASCII 代码。
如果 ASCII 码 不在特定范围内 函数应该 return 无效(如果不是数字,不是字母,不是“@”和“_”和“。”) ) 角色的位置。
代码永远不会 return 给出正确的结果。

Function FirstNotValid(xStr As String) As Long
    Dim xChar As Integer
    Dim xPos As Integer
    Dim I As Integer
    For I = 1 To Len(xStr)
        xChar = Asc(Mid(xStr, I, 1))
        If xChar < 45 Or (58 < xChar < 64) Or (90 < xChar < 97) Or 122 < xChar Then
            xPos = I
            Exit For
        End If
    Next
    FirstNotValid = xPos
End Function

Sub test()
    Debug.Print FirstNotValid("ab?!an@gmail.com")
End Sub

调用这个函数的例子,应该return3.结果总是1.
我知道“?”字符 ASCII 码为 33,不应该跳过 if 条件,但确实跳过了。

正如我在评论中提到的,您的代码正在评估 True 语句

If xChar < 45 Or (58 < xChar < 64) Or (90 < xChar < 97) Or 122 < xChar Then

这会导致进入 If...Then 块,因此 return 在您的代码的第一次迭代中输入 1。

您可以考虑将 If 语句条件更改为每个条件仅将 xChar 与一个值进行比较。

我会稍微不同地处理代码并使用 Array() 来容纳 'blacklist' 个字符,然后将字符串的每个字符与数组的每个元素进行比较 - 如果匹配,return字符位置。

Function InvalidCharacterPosition(ByVal StringToCheck As String) As Long

Dim ArrayElement As Long
Dim CharPosition As Long
Dim BlackListCharacters() As Variant
BlackListCharacters() = Array("?", "/", "<", ">", "*")

For CharPosition = 1 To Len(StringToCheck)
    For ArrayElement = LBound(BlackListCharacters) To UBound(BlackListCharacters)
        If Asc(Mid(StringToCheck, CharPosition, 1)) = Asc(BlackListCharacters(ArrayElement)) Then
            InvalidCharacterPosition = CharPosition
        End If
    Next ArrayElement
Next CharPosition

End Function

与您的代码设计非常相似,但我觉得这种方式更容易理解和遵循,也更容易修改(即只需添加任何额外的或轻松地从数组中删除任何需要的字符而不更改其余部分代码)。

调用这个和你的测试一样 returns 3:

Sub test()
    Debug.Print InvalidCharacterPosition("ab?!an@gmail.com")
End Sub

这是我能想到的另一种方法 - 将 xStr 拆分为字节数组,然后使用 Select 语句过滤一系列“允许的字符”:

Function FirstNotValid(xStr As String) As Long
    Dim i As Long
    Dim charArr() As Byte
    
    charArr = StrConv(xStr, vbFromUnicode)
    
    For i = 0 To UBound(charArr)
        Select Case charArr(i)
            Case 46         '.
            Case 48 To 57   '0-9
            Case 64 To 90   '@ + A-Z
            Case 95         '_
            Case 97 To 122  'a-z
            Case Else   'Any character that falls out of allowed range above
                FirstNotValid = i + 1
                Exit For
        End Select
    Next i
End Function

注意:这不适用于 Mac,因为 StrConv 的参数 vbFromUnicode 在 Mac 上不可用。