有没有办法通过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
答案 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
如果您对可能的边缘情况感到满意,我会尝试正则表达式方法。否则,我会查看第三方库。