通过VBS脚本检查URL的语法

通过VBS脚本检查URL的语法,url,vbscript,syntax,Url,Vbscript,Syntax,有没有办法通过visual basic检查URL的语法?下面是我的代码。我需要一种方法来检查语法并确保它是正确的(即有http、.com或.net或.edu)。我需要检查格式,以确保url的是典型的标准url格式。这能做到吗 Public PageSource As String Public httpRequest As Object Function GetURLStatus(ByVal URL As String, Optional AllowRedirects As Boolean)

有没有办法通过visual basic检查URL的语法?下面是我的代码。我需要一种方法来检查语法并确保它是正确的(即有http、.com或.net或.edu)。我需要检查格式,以确保url的是典型的标准url格式。这能做到吗

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
publicpagesource作为字符串
作为对象的公共httpRequest
函数GetURLStatus(ByVal URL作为字符串,可选AllowerStatus作为布尔值)
Const WinHttpRequestOption_EnableRedirects=6
如果httpRequest什么都不是,那么
出错时继续下一步
设置httpRequest=CreateObject(“WinHttp.WinHttpRequest.5.1”)
如果httpRequest什么都不是,那么
设置httpRequest=CreateObject(“WinHttp.WinHttpRequest.5”)
如果结束
呃,明白了
错误转到0
如果结束
httpRequest.Option(WinHttpRequestOption_EnableRedirects)=AllowRedirects
如果InStr(1,URL,“:/”)=0,则
URL=“http://”&URL
如果结束
出错时继续下一步
httpRequest.Open“GET”,URL,False
如果错误号为0,则
'处理连接错误
GetURLStatus=Err.Description
呃,明白了
退出功能
如果结束
错误转到0
出错时继续下一步
httpRequest.Send
httpRequest.WaitForResponse
如果错误号为0,则
PageSource=“错误”
GetURLStatus=Err.Description
呃,明白了
其他的
GetURLStatus=httpRequest.Status&“-”&httpRequest.StatusText
PageSource=httpRequest.ResponseText
如果结束
错误转到0
端函数

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

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

首先,您可能想弄清楚您想要覆盖哪些类型的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

如果您对可能出现的边缘情况满意,我会尝试正则表达式方法。否则,我会看一个第三方库。< /p>也许检查一下是否设置了一个通用的正则表达式?@ MikeChristensen,它是否暴露在COM上,好像OP是在VBScript解决方案之后?我想你可能误会了。我觉得那代码不像VBScript。您正在寻找VBScript、VBA、VB6或VB.NET吗?