[英]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.