316 lines
13 KiB
VB.net
316 lines
13 KiB
VB.net
|
|
'提供不同的输入验证方法,名称以 Validate 开头
|
|||
|
|
|
|||
|
|
''' <summary>
|
|||
|
|
''' 输入验证规则基类。要查看所有的输入验证规则,可在输入 Validate 后查看自动补全。
|
|||
|
|
''' </summary>
|
|||
|
|
Public MustInherit Class Validate
|
|||
|
|
''' <summary>
|
|||
|
|
''' 验证某字符串是否符合验证要求。若符合,返回空字符串;若不符合,返回错误原因。
|
|||
|
|
''' </summary>
|
|||
|
|
Public MustOverride Function Validate(Str As String) As String
|
|||
|
|
End Class
|
|||
|
|
|
|||
|
|
''' <summary>
|
|||
|
|
''' 若为空则直接通过检查。
|
|||
|
|
''' </summary>
|
|||
|
|
Public Class ValidateNullable
|
|||
|
|
Inherits Validate
|
|||
|
|
Public Overrides Function Validate(Str As String) As String
|
|||
|
|
If IsNothing(Str) OrElse String.IsNullOrEmpty(Str) Then Return Nothing
|
|||
|
|
Return ""
|
|||
|
|
End Function
|
|||
|
|
End Class
|
|||
|
|
|
|||
|
|
''' <summary>
|
|||
|
|
''' 不能为 Nothing 或空字符串(不包括全空格检查)。
|
|||
|
|
''' </summary>
|
|||
|
|
Public Class ValidateNullOrEmpty
|
|||
|
|
Inherits Validate
|
|||
|
|
Public Overrides Function Validate(Str As String) As String
|
|||
|
|
If IsNothing(Str) OrElse String.IsNullOrEmpty(Str) Then Return "输入内容不能为空!"
|
|||
|
|
Return ""
|
|||
|
|
End Function
|
|||
|
|
End Class
|
|||
|
|
|
|||
|
|
''' <summary>
|
|||
|
|
''' 不能为 Nothing 或空字符串(包括全空格检查)。
|
|||
|
|
''' </summary>
|
|||
|
|
Public Class ValidateNullOrWhiteSpace
|
|||
|
|
Inherits Validate
|
|||
|
|
Public Overrides Function Validate(Str As String) As String
|
|||
|
|
If IsNothing(Str) OrElse String.IsNullOrWhiteSpace(Str) Then Return "输入内容不能为空!"
|
|||
|
|
Return ""
|
|||
|
|
End Function
|
|||
|
|
End Class
|
|||
|
|
|
|||
|
|
''' <summary>
|
|||
|
|
''' 必须满足正则表达式。
|
|||
|
|
''' </summary>
|
|||
|
|
Public Class ValidateRegex
|
|||
|
|
Inherits Validate
|
|||
|
|
Public Property Regex As String
|
|||
|
|
Public Property ErrorDescription As String = ""
|
|||
|
|
Public Sub New()
|
|||
|
|
End Sub '用于 XAML 初始化
|
|||
|
|
Public Sub New(Regex As String, Optional ErrorDescription As String = "")
|
|||
|
|
Me.Regex = Regex
|
|||
|
|
Me.ErrorDescription = ErrorDescription
|
|||
|
|
End Sub
|
|||
|
|
Public Overrides Function Validate(Str As String) As String
|
|||
|
|
If Not RegexCheck(Str, Regex) Then Return ErrorDescription
|
|||
|
|
Return ""
|
|||
|
|
End Function
|
|||
|
|
End Class
|
|||
|
|
|
|||
|
|
''' <summary>
|
|||
|
|
''' 必须是一个完整网址。
|
|||
|
|
''' </summary>
|
|||
|
|
Public Class ValidateHttp
|
|||
|
|
Inherits Validate
|
|||
|
|
Public Sub New()
|
|||
|
|
End Sub '用于 XAML 初始化
|
|||
|
|
Public Overrides Function Validate(Str As String) As String
|
|||
|
|
If Str.EndsWith("/") Then Str = Str.Substring(0, Str.Length - 1)
|
|||
|
|
If Not RegexCheck(Str, "^(http[s]?)\://") Then Return "输入的网址无效!"
|
|||
|
|
Return ""
|
|||
|
|
End Function
|
|||
|
|
End Class
|
|||
|
|
|
|||
|
|
''' <summary>
|
|||
|
|
''' 必须为整数。
|
|||
|
|
''' </summary>
|
|||
|
|
Public Class ValidateInteger
|
|||
|
|
Inherits Validate
|
|||
|
|
Public Property Min As Integer
|
|||
|
|
Public Property Max As Integer = Integer.MaxValue
|
|||
|
|
Public Sub New()
|
|||
|
|
End Sub '用于 XAML 初始化
|
|||
|
|
Public Sub New(Min As Integer, Max As Integer)
|
|||
|
|
Me.Min = Min
|
|||
|
|
Me.Max = Max
|
|||
|
|
End Sub
|
|||
|
|
Public Overrides Function Validate(Str As String) As String
|
|||
|
|
If Str.Length > 9 Then Return "请输入一个大小合理的数字!"
|
|||
|
|
Dim Valed As Integer = Val(Str)
|
|||
|
|
If Valed.ToString <> Str Then Return "请输入一个整数!"
|
|||
|
|
If Val(Str) > Max Then Return "不可超过 " & Max & "!"
|
|||
|
|
If Val(Str) < Min Then Return "不可低于 " & Min & "!"
|
|||
|
|
Return ""
|
|||
|
|
End Function
|
|||
|
|
End Class
|
|||
|
|
|
|||
|
|
''' <summary>
|
|||
|
|
''' 长度限制。
|
|||
|
|
''' </summary>
|
|||
|
|
Public Class ValidateLength
|
|||
|
|
Inherits Validate
|
|||
|
|
Public Property Min As Integer = 0
|
|||
|
|
Public Property Max As Integer = Integer.MaxValue
|
|||
|
|
Public Sub New()
|
|||
|
|
End Sub '用于 XAML 初始化
|
|||
|
|
Public Sub New(Min As Integer, Optional Max As Integer = Integer.MaxValue)
|
|||
|
|
Me.Min = Min
|
|||
|
|
Me.Max = Max
|
|||
|
|
End Sub
|
|||
|
|
Public Overrides Function Validate(Str As String) As String
|
|||
|
|
If Len(Str) <> Max AndAlso Max = Min Then Return "长度必须为 " & Max & " 个字符!"
|
|||
|
|
If Len(Str) > Max Then Return "长度最长为 " & Max & " 个字符!"
|
|||
|
|
If Len(Str) < Min Then Return "长度至少需 " & Min & " 个字符!"
|
|||
|
|
Return ""
|
|||
|
|
End Function
|
|||
|
|
End Class
|
|||
|
|
|
|||
|
|
''' <summary>
|
|||
|
|
''' 不能包含某些特定字符串。忽略大小写。
|
|||
|
|
''' </summary>
|
|||
|
|
Public Class ValidateExcept
|
|||
|
|
Inherits Validate
|
|||
|
|
Public Property Excepts As ObjectModel.Collection(Of String) = New ObjectModel.Collection(Of String)
|
|||
|
|
Public Property ErrorMessage As String
|
|||
|
|
Public Sub New()
|
|||
|
|
ErrorMessage = "输入内容不能包含 %!"
|
|||
|
|
End Sub '用于 XAML 初始化
|
|||
|
|
Public Sub New(Excepts As ObjectModel.Collection(Of String), Optional ErrorMessage As String = "输入内容不能包含 %!")
|
|||
|
|
Me.Excepts = Excepts
|
|||
|
|
Me.ErrorMessage = ErrorMessage
|
|||
|
|
End Sub
|
|||
|
|
Public Sub New(Excepts As IEnumerable, Optional ErrorMessage As String = "输入内容不能包含 %!")
|
|||
|
|
Me.Excepts = New ObjectModel.Collection(Of String)
|
|||
|
|
Me.ErrorMessage = ErrorMessage
|
|||
|
|
For Each Data As String In Excepts
|
|||
|
|
Me.Excepts.Add(Data)
|
|||
|
|
Next
|
|||
|
|
End Sub
|
|||
|
|
Public Overrides Function Validate(Str As String) As String
|
|||
|
|
For Each Ch As String In Excepts
|
|||
|
|
If Str.IndexOf(Ch, StringComparison.OrdinalIgnoreCase) >= 0 Then
|
|||
|
|
If IsNothing(ErrorMessage) Then ErrorMessage = ""
|
|||
|
|
Return ErrorMessage.Replace("%", Ch)
|
|||
|
|
End If
|
|||
|
|
Next
|
|||
|
|
Return ""
|
|||
|
|
End Function
|
|||
|
|
|
|||
|
|
End Class
|
|||
|
|
|
|||
|
|
''' <summary>
|
|||
|
|
''' 不能与某些特定字符串相同。
|
|||
|
|
''' </summary>
|
|||
|
|
Public Class ValidateExceptSame
|
|||
|
|
Inherits Validate
|
|||
|
|
Public Property Excepts As ObjectModel.Collection(Of String) = New ObjectModel.Collection(Of String)
|
|||
|
|
Public Property ErrorMessage As String
|
|||
|
|
Public Property IgnoreCase As Boolean = False
|
|||
|
|
Public Sub New(Excepts As ObjectModel.Collection(Of String), Optional ErrorMessage As String = "输入内容不能为 %!", Optional IgnoreCase As Boolean = False)
|
|||
|
|
Me.Excepts = Excepts
|
|||
|
|
Me.ErrorMessage = ErrorMessage
|
|||
|
|
Me.IgnoreCase = IgnoreCase
|
|||
|
|
End Sub
|
|||
|
|
Public Sub New(Excepts As IEnumerable, Optional ErrorMessage As String = "输入内容不能为 %!", Optional IgnoreCase As Boolean = False)
|
|||
|
|
Me.Excepts = New ObjectModel.Collection(Of String)
|
|||
|
|
For Each Data As String In Excepts
|
|||
|
|
Me.Excepts.Add(Data)
|
|||
|
|
Next
|
|||
|
|
Me.ErrorMessage = ErrorMessage
|
|||
|
|
Me.IgnoreCase = IgnoreCase
|
|||
|
|
End Sub
|
|||
|
|
Public Overrides Function Validate(Str As String) As String
|
|||
|
|
If Str Is Nothing Then Return ErrorMessage.Replace("%", "null")
|
|||
|
|
For Each Ch As String In Excepts
|
|||
|
|
If IgnoreCase Then
|
|||
|
|
If Str.ToLower = Ch.ToLower Then Return ErrorMessage.Replace("%", Ch)
|
|||
|
|
Else
|
|||
|
|
If Str.Equals(Ch) Then Return ErrorMessage.Replace("%", Ch) '使用 = 不确定是否会忽略大小写
|
|||
|
|
End If
|
|||
|
|
Next
|
|||
|
|
Return ""
|
|||
|
|
End Function
|
|||
|
|
|
|||
|
|
End Class
|
|||
|
|
|
|||
|
|
''' <summary>
|
|||
|
|
''' 对文件夹名的粗略的特化检测。
|
|||
|
|
''' </summary>
|
|||
|
|
Public Class ValidateFolderName
|
|||
|
|
Inherits Validate
|
|||
|
|
Public Property Path As String
|
|||
|
|
Public Property UseMinecraftCharCheck As Boolean = True
|
|||
|
|
Public Property IgnoreCase As Boolean = True
|
|||
|
|
Private ReadOnly PathIgnore As IEnumerable(Of DirectoryInfo)
|
|||
|
|
Public Sub New(Path As String, Optional UseMinecraftCharCheck As Boolean = True, Optional IgnoreCase As Boolean = True)
|
|||
|
|
Me.Path = Path
|
|||
|
|
Me.IgnoreCase = IgnoreCase
|
|||
|
|
Me.UseMinecraftCharCheck = UseMinecraftCharCheck
|
|||
|
|
On Error Resume Next
|
|||
|
|
PathIgnore = New DirectoryInfo(Path).EnumerateDirectories
|
|||
|
|
End Sub
|
|||
|
|
Public Overrides Function Validate(Str As String) As String
|
|||
|
|
Try
|
|||
|
|
'检查是否为空
|
|||
|
|
Dim LengthCheck As String = New ValidateNullOrWhiteSpace().Validate(Str)
|
|||
|
|
If Not LengthCheck = "" Then Return LengthCheck
|
|||
|
|
'检查空格
|
|||
|
|
If Str.StartsWith(" ") Then Return "文件夹名不能以空格开头!"
|
|||
|
|
If Str.EndsWith(" ") Then Return "文件夹名不能以空格结尾!"
|
|||
|
|
'检查长度
|
|||
|
|
LengthCheck = New ValidateLength(1, 100).Validate(Str)
|
|||
|
|
If Not LengthCheck = "" Then Return LengthCheck
|
|||
|
|
'检查尾部小数点
|
|||
|
|
If Str.EndsWith(".") Then Return "文件夹名不能以小数点结尾!"
|
|||
|
|
'检查特殊字符
|
|||
|
|
Dim CharactCheck As String = New ValidateExcept(IO.Path.GetInvalidFileNameChars() & If(UseMinecraftCharCheck, "!;", ""), "文件夹名不可包含 % 字符!").Validate(Str)
|
|||
|
|
If Not CharactCheck = "" Then Return CharactCheck
|
|||
|
|
'检查特殊字符串
|
|||
|
|
Dim InvalidStrCheck As String = New ValidateExceptSame({"CON", "PRN", "AUX", "CLOCK$", "NUL", "COM0", "COM1", "COM2", "COM3", "COM4", "COM5", "COM6", "COM7", "COM8", "COM9", "LPT0", "LPT1", "LPT2", "LPT3", "LPT4", "LPT5", "LPT6", "LPT7", "LPT8", "LPT9"}, "文件夹名不可为 %!").Validate(Str)
|
|||
|
|
If Not InvalidStrCheck = "" Then Return InvalidStrCheck
|
|||
|
|
'检查文件夹重名
|
|||
|
|
Dim Arr As New List(Of String)
|
|||
|
|
If PathIgnore IsNot Nothing Then
|
|||
|
|
For Each Folder As DirectoryInfo In PathIgnore
|
|||
|
|
Arr.Add(Folder.Name)
|
|||
|
|
Next
|
|||
|
|
End If
|
|||
|
|
Dim SameNameCheck = New ValidateExceptSame(Arr, "不可与现有文件夹重名!", IgnoreCase).Validate(Str)
|
|||
|
|
If Not SameNameCheck = "" Then Return SameNameCheck
|
|||
|
|
Return ""
|
|||
|
|
Catch ex As Exception
|
|||
|
|
Log(ex, "检查文件夹名出错")
|
|||
|
|
Return "错误:" & ex.Message
|
|||
|
|
End Try
|
|||
|
|
End Function
|
|||
|
|
End Class
|
|||
|
|
|
|||
|
|
''' <summary>
|
|||
|
|
''' 要求输入一个可用的文件夹路径。
|
|||
|
|
''' </summary>
|
|||
|
|
Public Class ValidateFolderPath
|
|||
|
|
Inherits Validate
|
|||
|
|
Public Property UseMinecraftCharCheck As Boolean = True
|
|||
|
|
Public Sub New()
|
|||
|
|
End Sub
|
|||
|
|
Public Sub New(UseMinecraftCharCheck As Boolean)
|
|||
|
|
Me.UseMinecraftCharCheck = UseMinecraftCharCheck
|
|||
|
|
End Sub
|
|||
|
|
Public Overrides Function Validate(Str As String) As String
|
|||
|
|
'去除尾部斜线,统一为 \
|
|||
|
|
Str = Str.Replace("/", "\")
|
|||
|
|
If Not Str.TrimEnd("\").EndsWith(":") Then Str = Str.TrimEnd("\")
|
|||
|
|
'检查是否为空
|
|||
|
|
Dim LengthCheck As String = New ValidateNullOrWhiteSpace().Validate(Str)
|
|||
|
|
If Not LengthCheck = "" Then Return LengthCheck
|
|||
|
|
'检查长度
|
|||
|
|
LengthCheck = New ValidateLength(1, 254).Validate(Str)
|
|||
|
|
If Not LengthCheck = "" Then Return LengthCheck
|
|||
|
|
'检查开头
|
|||
|
|
If Str.StartsWith("\\Mac\") Then GoTo Fin
|
|||
|
|
For Each Drive As DriveInfo In My.Computer.FileSystem.Drives
|
|||
|
|
If Str.ToUpper = Drive.Name Then Return ""
|
|||
|
|
If Str.ToUpper.StartsWith(Drive.Name) Then GoTo Fin
|
|||
|
|
Next
|
|||
|
|
Return "文件夹路径头存在错误!"
|
|||
|
|
Fin:
|
|||
|
|
'对首层以外的路径检查
|
|||
|
|
For i = If(Str.StartsWith("\\Mac\"), 2, 1) To Str.Split("\").Count - 1
|
|||
|
|
Dim SubStr As String = Str.Split("\")(i)
|
|||
|
|
'检查是否为空
|
|||
|
|
Dim SubLengthCheck As String = New ValidateNullOrWhiteSpace().Validate(SubStr)
|
|||
|
|
If Not SubLengthCheck = "" Then Return "文件夹路径存在错误!"
|
|||
|
|
'检查特殊字符
|
|||
|
|
Dim CharactCheck As String = New ValidateExcept(IO.Path.GetInvalidFileNameChars() & If(UseMinecraftCharCheck, "!;", ""), "路径中存在无效字符!").Validate(SubStr)
|
|||
|
|
If Not CharactCheck = "" Then Return CharactCheck
|
|||
|
|
'检查头部空格
|
|||
|
|
If SubStr.StartsWith(" ") Then Return "文件夹名不能以空格开头!"
|
|||
|
|
If SubStr.EndsWith(" ") Then Return "文件夹名不能以空格结尾!"
|
|||
|
|
'检查尾部小数点
|
|||
|
|
If SubStr.EndsWith(".") Then Return "文件夹名不能以小数点结尾!"
|
|||
|
|
'检查特殊字符串
|
|||
|
|
Dim InvalidStrCheck As String = New ValidateExceptSame({"CON", "PRN", "AUX", "CLOCK$", "NUL", "COM0", "COM1", "COM2", "COM3", "COM4", "COM5", "COM6", "COM7", "COM8", "COM9", "LPT0", "LPT1", "LPT2", "LPT3", "LPT4", "LPT5", "LPT6", "LPT7", "LPT8", "LPT9"}, "文件夹名不可为 %!").Validate(SubStr)
|
|||
|
|
If Not InvalidStrCheck = "" Then Return InvalidStrCheck
|
|||
|
|
Next
|
|||
|
|
Return ""
|
|||
|
|
End Function
|
|||
|
|
End Class
|
|||
|
|
|
|||
|
|
''' <summary>
|
|||
|
|
''' 敏感词过滤。
|
|||
|
|
''' </summary>
|
|||
|
|
Public Class ValidateFilter
|
|||
|
|
Inherits Validate
|
|||
|
|
Private Shared Excepts As String() = SecretDecrypt(SecretSensitiveWordsRaw).Split("|")
|
|||
|
|
Public Sub New()
|
|||
|
|
End Sub '用于 XAML 初始化
|
|||
|
|
Public Overrides Function Validate(Str As String) As String
|
|||
|
|
'提取无间隔符的字符串
|
|||
|
|
Dim RealStr As String = ""
|
|||
|
|
For Each St In If(Str, "").ToLower
|
|||
|
|
If String.IsNullOrWhiteSpace(St.ToString) OrElse ("!@#$%^&*()_+-={}[]|\;':"",./<>? ~ ·!¥…()—,。、《》?‘;:【】{}" & vbLQ & vbRQ).ToCharArray.Contains(St) Then Continue For
|
|||
|
|
RealStr += St
|
|||
|
|
Next
|
|||
|
|
'检查
|
|||
|
|
For Each Except In Excepts
|
|||
|
|
If RealStr.Contains(Except) Then Return "存在敏感内容!"
|
|||
|
|
Next
|
|||
|
|
Return ""
|
|||
|
|
End Function
|
|||
|
|
End Class
|