使用Golang验证HTML

jdzmm42g  于 2023-03-16  发布在  Go
关注(0)|答案(3)|浏览(227)

在我的API中,我有一个POST端点,其中一个被发送到该端点的预期参数是一个(松散的)有效HTML块。
POST将采用JSON格式。
在golang中我怎么才能确保发布的HTML是有效的呢?我已经找了几天了,但还是没有找到任何东西?
“有效”这个词有点松散。我试图确保标签是打开和关闭的,语音标记在正确的地方等等。

lc8prwob

lc8prwob1#

现在讲这个有点晚了,但是如果你只想验证HTML的结构,这里有几个Go语言的解析器可以用(比如,你不关心div是否在span中,这是不允许的,但这是一个模式级的问题):

x/网络/html

golang.org/x/net/html包包含了一个 * 非常 * 宽松的解析器。几乎任何东西都可以生成有效的HTML,类似于许多Web浏览器尝试做的事情(例如,在许多情况下,它会忽略未转义值的问题)。例如,像<span>></span>这样的东西可能会验证(我没有检查这个特定的,我只是虚构了它)为一个包含"〉“字符的span。
它可以像这样使用:

r := strings.NewReader(`<span>></span>`)
z := html.NewTokenizer(r)
for {
    tt := z.Next()
    if tt == html.ErrorToken {
        err := z.Err()
        if err == io.EOF {
            // Not an error, we're done and it's valid!
            return nil
        }
        return err
    }
}

编码/xml

如果你需要更严格一点的东西,但这对HTML来说仍然是可以的,你可以配置一个xml.Decoder来处理HTML(这就是我所做的,它让我在任何给定的情况下都可以更灵活地选择我想要的严格程度):

r := strings.NewReader(`<html></html>`)
d := xml.NewDecoder(r)

// Configure the decoder for HTML; leave off strict and autoclose for XHTML
d.Strict = false
d.AutoClose = xml.HTMLAutoClose
d.Entity = xml.HTMLEntity
for {
    tt, err := d.Token()
    switch err {
    case io.EOF:
        return nil // We're done, it's valid!
    case nil:
    default:
        return err // Oops, something wasn't right
    }
}
vwoqyblh

vwoqyblh2#

检查提供的HTML blob是否正确地使用html.Parsethis package进行解析。对于验证,您所要做的只是检查错误。

qyzbxkaa

qyzbxkaa3#

请使用golang.org/x/net/html

import (
    "strings"
    "golang.org/x/net/html"
)

func isValidHTML(htmlStr string) bool {
    _, err := html.Parse(strings.NewReader(htmlStr))
    return err == nil
}

相关问题