[英]HTML Validation with Golang
在我的API中,我有一个POST终点。 发布到该终点的预期参数之一是(松散)有效HTML块。
POST将采用JSON格式。
在golang中,我如何确保发布的HTML有效? 我一直在寻找一些东西现在仍然没有找到任何东西?
“有效”一词有点松散。 我试图确保标签打开和关闭,语音标记在正确的位置等。
您使用此程序包中的 html.Parse
检查HTML blob是否正确解析。 仅用于验证,您所要做的就是检查错误。
游戏有点晚了,但是如果你只是想验证HTML的结构,那么Go中的几个解析器会起作用(例如,你不关心div是否在一个跨度内,这是不允许的)但是模式级问题):
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
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.