检查电子邮件地址是否包含不允许的字符
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 上不可用。
我正在使用 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 上不可用。