使用Golang进行HTML验证

3
我的API中有一个POST端点。其中一个期望被发布到该端点的参数是一块(松散)有效的HTML。
POST将采用JSON格式。
在golang中,如何确保发布的HTML是有效的? 我已经寻找了几天,仍然没有找到任何信息?
术语“有效”有点含糊不清。我试图确保标签被打开和关闭,引号放置正确等。

1
听起来你正在寻找一个HTML解析器。 - user745235
3个回答

7
有点晚了,但以下是一些适用于Go语言的解析器,如果您只想验证HTML的结构(例如,您不关心div是否在span内,这是一个模式级别的问题,但不影响验证),可以使用这些解析器:

x/net/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
    }
}

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

2

您需要使用这个包中的html.Parse方法,检查提供的HTML代码是否可以正确解析。仅需验证时,您只需要检查是否存在错误。


0

使用 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
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接