繁体   English   中英

使用Golang进行HTML验证

[英]HTML Validation with Golang

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

POST将采用JSON格式。

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

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

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

游戏有点晚了,但是如果你只是想验证HTML的结构,那么Go中的几个解析器会起作用(例如,你不关心div是否在一个跨度内,这是不允许的)但是模式级问题):

X /净/ 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
    }
}

编码/ 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
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM