我的API中有一个POST端点。其中一个期望被发布到该端点的参数是一块(松散)有效的HTML。
POST将采用JSON格式。
在golang中,如何确保发布的HTML是有效的? 我已经寻找了几天,仍然没有找到任何信息?
术语“有效”有点含糊不清。我试图确保标签被打开和关闭,引号放置正确等。
POST将采用JSON格式。
在golang中,如何确保发布的HTML是有效的? 我已经寻找了几天,仍然没有找到任何信息?
术语“有效”有点含糊不清。我试图确保标签被打开和关闭,引号放置正确等。
golang.org/x/net/html
包含一个非常宽松的解析器。几乎任何内容都会被视为有效的HTML,类似于许多网络浏览器尝试做的事情(例如,在许多情况下,它将忽略未转义值的问题)。
例如,像<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
}
}
如果您需要更严格的内容,但仍可用于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
}
}
使用 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
}