通过VBS脚本检查URL的语法

3

有没有一种通过Visual Basic检查URL语法的方法?以下是我的代码。我需要一种只检查语法并确保其正确(即具有http,.com或.net或.edu)的方法。我需要检查格式以确保这些网址符合标准网址格式。这可以完成吗?

Public PageSource As String
Public httpRequest As Object

Function GetURLStatus(ByVal URL As String, Optional AllowRedirects As Boolean)

    Const WinHttpRequestOption_EnableRedirects = 6


        If httpRequest Is Nothing Then
            On Error Resume Next
                Set httpRequest = CreateObject("WinHttp.WinHttpRequest.5.1")
                If httpRequest Is Nothing Then
                    Set httpRequest = CreateObject("WinHttp.WinHttpRequest.5")
                End If
            Err.Clear
            On Error GoTo 0
        End If


          httpRequest.Option(WinHttpRequestOption_EnableRedirects) = AllowRedirects



          If InStr(1, URL, "://") = 0 Then
             URL = "http://" & URL
          End If


               On Error Resume Next
                  httpRequest.Open "GET", URL, False
                  If Err.Number <> 0 Then
                   ' Handle connection errors
                     GetURLStatus = Err.Description
                     Err.Clear
                     Exit Function
                  End If
               On Error GoTo 0


               On Error Resume Next
                  httpRequest.Send
                  httpRequest.WaitForResponse
                  If Err.Number <> 0 Then

                     PageSource = "Error"
                     GetURLStatus = Err.Description
                     Err.Clear
                  Else

                     GetURLStatus = httpRequest.Status & " - " & httpRequest.StatusText

                     PageSource = httpRequest.ResponseText
                  End If
               On Error GoTo 0

End Function

也许可以查看一下Url类 - Mike Christensen
考虑设置一个通用的正则表达式? - Dave
@MikeChristensen,考虑到OP正在寻找VBScript解决方案,它是否对COM暴露可见? - user692942
我认为您可能标记错误了。那段代码看起来不像是VBScript。您是在寻找VBScript、VBA、VB6还是VB.NET? - user65839
1个回答

3

我能想到三种方法:正则表达式、使用XMLHTTP和使用第三方库。

如果您可以接受使用其他语言,您可以编写自己的ActiveX控件。例如,VB.Net具有内置类,使得验证URL变得非常容易。我假设您仅寻找VB Script答案,因此我不会尝试涵盖其他语言。

首先,您可能要确定要覆盖哪些类型的URL。根据规范,以下所有内容都是有效的URL:

ftp://ftp.is.co.za/rfc/rfc1808.txt
http://www.ietf.org/rfc/rfc2396.txt
ldap://[2001:db8::7]/c=GB?objectClass?one
mailto:John.Doe@example.com
news:comp.infosystems.www.servers.unix
tel:+1-816-555-1212
telnet://192.0.2.16:80/
urn:oasis:names:specification:docbook:dtd:xml:4.1.2

你的范围越小,解决方案就越简单。如果你需要涵盖所有可能的类型,我建议查看第三方库。通过快速谷歌,我找到了这个。这不是认可。我从未使用过这个库,我相信还会有许多其他很棒的库。
您可以尝试正则表达式方法,但它包含许多极端情况,可能会让您发疯。同样,如果你能缩小范围,你会更成功。下面是一个详细的讨论,介绍如何使用正则表达式验证URL。这也是我无耻地从下面的例子中偷来的正则表达式 :)。
我的VB有点生疏,但这里是一个正则表达式的例子...
Wscript.Echo IsUrlValidRegex("http://www.stackoverflow.com")
Wscript.Echo IsUrlValidRegex("this is not a url")
Wscript.Echo IsUrlValidRegex("mailto:John.Doe@example.com")

Function IsUrlValidRegex(url)
    Set oRegex = new regexp

    oRegex.Pattern = "((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)"
    oRegex.IgnoreCase = true


    if oRegex.Test(url) then
        IsUrlValidRegex = true
    else
        IsUrlValidRegex = false
    end if    
End Function

另一种可能的方法是尝试访问URL以确定其是否有效。这听起来很好,但它仅适用于HTTP / S,并且在访问实时服务器时效果最佳。我不确定我会推荐这种方法,但以下是它的工作方式...

Wscript.Echo IsUrlValidHttp("http://www.stackoverflow.com")
Wscript.Echo IsUrlValidHttp("http://not.arealwebsite.com/")
Wscript.Echo IsUrlValidHttp("this is not a url")
Wscript.Echo IsUrlValidHttp("mailto:John.Doe@example.com")

Function IsUrlValidHttp(sUrl)
    On Error Resume Next

    Dim oXMLHTTP
    Set oXMLHTTP = CreateObject("MSXML2.ServerXMLHTTP")

    oXMLHTTP.Open "GET", sUrl, False
    oXMLHTTP.Send

    If Err = 0 Then
        '  valid HTTP URL, valid server 
        'If oXMLHTTP.Status = 200 Then
            IsUrlValidHttp = true    
        'End If
    ElseIf Err = -2147012889 Then
        ' valid HTTP URL, invalid server
        IsUrlValidHttp = true
    ElseIf Err = -2147467259 Then
        ' not a valid http URL
        IsUrlValidHttp = false        
    End If
 End Function

如果您可以接受可能出现的边缘情况,我建议您尝试正则表达式方法。否则,您可以考虑使用第三方库。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接