使用Golang进行HTML验证

时间:2015-08-03 13:05:21

标签: html json go

在我的API中,我有一个POST终点。发布到该终点的预期参数之一是(松散)有效HTML块。

POST将采用JSON格式。

在golang中,我如何确保发布的HTML有效?我一直在寻找一些东西,现在仍然没有找到任何东西?

“有效”一词有点松散。我试图确保标签打开和关闭,语音标记在正确的位置等。

2 个答案:

答案 0 :(得分:2)

您使用html.Parse中的this package检查HTML blob是否正确解析。仅用于验证,您所要做的就是检查错误。

答案 1 :(得分:1)

游戏有点晚了,但是如果您只是想验证HTML的结构(例如,您不在乎div是否在span范围内,这是Go中的几个解析器就可以使用),不允许,但这是架构级别的问题):

x / net / html

golang.org/x/net/html程序包包含一个非常松散解析器。几乎所有内容都会产生有效的HTML,这与许多Web浏览器尝试执行的操作类似(例如,在许多情况下,它将忽略未转义的值的问题)。 例如,类似<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
    }
}

encoding / 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
    }
}