在我的API中,我有一个POST终点。发布到该终点的预期参数之一是(松散)有效HTML块。
POST将采用JSON格式。
在golang中,我如何确保发布的HTML有效?我一直在寻找一些东西,现在仍然没有找到任何东西?
“有效”一词有点松散。我试图确保标签打开和关闭,语音标记在正确的位置等。
答案 0 :(得分:2)
您使用html.Parse
中的this package检查HTML blob是否正确解析。仅用于验证,您所要做的就是检查错误。
答案 1 :(得分:1)
游戏有点晚了,但是如果您只是想验证HTML的结构(例如,您不在乎div是否在span范围内,这是Go中的几个解析器就可以使用),不允许,但这是架构级别的问题):
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
}
}
如果您需要一些更严格的内容,但是对于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
}
}