Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Validation 确保URI有效_Validation_Url_Go - Fatal编程技术网

Validation 确保URI有效

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) }

我试图确保传递给我的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)
    }
    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)
}