Validation 确保URI有效
我试图确保传递给我的go程序的URL是有效的。然而,我似乎不知道该怎么做。我想我可以直接通过Validation 确保URI有效,validation,url,go,Validation,Url,Go,我试图确保传递给我的go程序的URL是有效的。然而,我似乎不知道该怎么做。我想我可以直接通过url.Parse将其输入,但这似乎不起作用 package main import ( "fmt" "net/url" ) func main() { url, err := url.Parse("http:::/not.valid/a//a??a?b=&&c#hi") if err != nil { panic(err) }
url.Parse
将其输入,但这似乎不起作用
package main
import (
"fmt"
"net/url"
)
func main() {
url, err := url.Parse("http:::/not.valid/a//a??a?b=&&c#hi")
if err != nil {
panic(err)
}
fmt.Println("It's valid!", url.String())
}
是否有类似我可以使用的内容?您可以检查您的URL是否有方案、主机和/或路径 如果检查返回的URL,可以看到无效部分插入到不透明数据部分(因此在某种意义上,它是有效的) 如果解析URL时没有方案、主机和路径,您可能会认为它无效。(虽然没有路径的主机通常是正常的,因为它意味着
/
,所以您需要检查它)
如果viaRequest
为true,则函数将返回错误,这意味着假定URL通过HTTP请求到达。当您直接调用
url.Parse()
时,情况并非如此:请参阅
和func parse(rawurl字符串,viaRequest bool)(url*url,err error){
仅在viaRequest
为真时返回err
这就是为什么直接使用url.Parse()
时,您从未看到任何错误
在后一种情况下,如果从未返回任何
err
,则可以检查返回的字段。空的
url.Scheme
,或不是预期的url.Path
,将指示错误。尝试一下此软件包,您需要的是IsURL函数。(您也可以使用regexp软件包)
我在写我的时没有看到你的答案。+1Ah,很有用。这样我可以强制方案也始终为HTTPS。你可能希望排除
u.Path
复选框,否则会出现一个url,如https://google.com
将无效。除了下面完全正确的建议之外,在使用url包旁边使用“url”作为变量名是no好主意:-)@ABri我意识到当我的程序中断时:D
url.URL{Scheme:"http", Opaque:"::/not.valid/a//a", Host:"", Path:"", RawQuery:"?a?b=&&c", Fragment:"hi"}
u, err := url.Parse("http:::/not.valid/a//a??a?b=&&c#hi")
if err != nil {
log.Fatal(err)
}
if u.Scheme == "" || u.Host == "" || u.Path == "" {
log.Fatal("invalid URL")
}
if url, err = parse(u, false); err != nil {
return nil, err
}
package main
import (
"fmt"
"regexp"
)
const URL string = `^((ftp|http|https):\/\/)?(\S+(:\S*)?@)?((([1-9]\d?|1\d\d|2[01]\d|22[0-3])(\.(1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.([0-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(((([a-z\x{00a1}-\x{ffff}0-9]+-?-?_?)*[a-z\x{00a1}-\x{ffff}0-9]+)\.)?)?(([a-z\x{00a1}-\x{ffff}0-9]+-?-?_?)*[a-z\x{00a1}-\x{ffff}0-9]+)(?:\.([a-z\x{00a1}-\x{ffff}]{2,}))?)|localhost)(:(\d{1,5}))?((\/|\?|#)[^\s]*)?$`
func Matches(str, pattern string) bool {
match, _ := regexp.MatchString(pattern, str)
return match
}
func main() {
u1 := "http:::/not.valid/a//a??a?b=&&c#hi"
u2 := "http://golang.fastrl.com"
func(us ...string) {
for _, u := range us {
fmt.Println(Matches(u, URL))
}
}(u1, u2)
}