在我的API中,我有一个POST端点,其中一个被发送到该端点的预期参数是一个(松散的)有效HTML块。POST将采用JSON格式。在golang中我怎么才能确保发布的HTML是有效的呢?我已经找了几天了,但还是没有找到任何东西?“有效”这个词有点松散。我试图确保标签是打开和关闭的,语音标记在正确的地方等等。
lc8prwob1#
现在讲这个有点晚了,但是如果你只想验证HTML的结构,这里有几个Go语言的解析器可以用(比如,你不关心div是否在span中,这是不允许的,但这是一个模式级的问题):
golang.org/x/net/html包包含了一个 * 非常 * 宽松的解析器。几乎任何东西都可以生成有效的HTML,类似于许多Web浏览器尝试做的事情(例如,在许多情况下,它会忽略未转义值的问题)。例如,像<span>></span>这样的东西可能会验证(我没有检查这个特定的,我只是虚构了它)为一个包含"〉“字符的span。它可以像这样使用:
golang.org/x/net/html
<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(这就是我所做的,它让我在任何给定的情况下都可以更灵活地选择我想要的严格程度):
xml.Decoder
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 } }
vwoqyblh2#
检查提供的HTML blob是否正确地使用html.Parse从this package进行解析。对于验证,您所要做的只是检查错误。
html.Parse
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 }
3条答案
按热度按时间lc8prwob1#
现在讲这个有点晚了,但是如果你只想验证HTML的结构,这里有几个Go语言的解析器可以用(比如,你不关心div是否在span中,这是不允许的,但这是一个模式级的问题):
x/网络/html
golang.org/x/net/html
包包含了一个 * 非常 * 宽松的解析器。几乎任何东西都可以生成有效的HTML,类似于许多Web浏览器尝试做的事情(例如,在许多情况下,它会忽略未转义值的问题)。例如,像<span>></span>
这样的东西可能会验证(我没有检查这个特定的,我只是虚构了它)为一个包含"〉“字符的span。它可以像这样使用:
编码/xml
如果你需要更严格一点的东西,但这对HTML来说仍然是可以的,你可以配置一个
xml.Decoder
来处理HTML(这就是我所做的,它让我在任何给定的情况下都可以更灵活地选择我想要的严格程度):vwoqyblh2#
检查提供的HTML blob是否正确地使用
html.Parse
从this package进行解析。对于验证,您所要做的只是检查错误。qyzbxkaa3#
请使用golang.org/x/net/html