通过VBS Script检查URL的语法

时间:2016-06-02 21:32:55

标签: url vbscript syntax

有没有办法通过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

1 个答案:

答案 0 :(得分:3)

我想到了三种方法:正则表达式,使用XMLHTTP,以及使用第三方库。

如果您可以使用其他语言,则可以编写自己的ActiveX控件。例如,VB.Net具有内置类,可以非常轻松地验证URL。我假设您正在寻找一个只有VB脚本的答案,所以我甚至不会尝试覆盖那个答案。

首先,您可能想知道要覆盖哪种类型的网址。根据{{​​3}},所有这些都是有效的网址:

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

您的范围越窄,您的解决方案就越不复杂。如果您需要涵盖所有可能的类型,我会查看第三方库。快速谷歌发现spec。这不是认可。我从来没有使用过这个图书馆,而且我确信还有很多其他很棒的图书馆。

您可以尝试正则表达式方法,但它充满了可能会让您发疯的边缘情况。同样,如果您可以缩小范围,您将会更加成功。以下是使用正则表达式验证网址的详细this。这也是我在下面的例子中无耻地窃取正则表达式的地方:)。

我的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

如果您对可能的边缘情况感到满意,我会尝试正则表达式方法。否则,我会查看第三方库。