1

将 []byte 传递到模板中,作为论坛风格 Web 应用程序上消息帖子的正文。在模板中,调用转换为字符串的方法,并在此过程中将所有换行符切换为换行符:

<p>{{.BodyString}}</p>

...

func (p *Post) BodyString() string {
    nl := regexp.MustCompile(`\n`)
    return nl.ReplaceAllString(string(p.Body), `<br>`)
}

你最终会得到什么:

paragraphs <br> <br>in <br> <br>this <br> <br>post

我不想用 HTML(p.Body) 传递整个帖子,因为它代表来自潜在不可靠来源的第三方数据。有没有办法使用 vanilla Go1 模板包仅将一些标签列入白名单以进行格式化?

4

2 回答 2

2

我确实认为您想解析 HTML。exp/html 中的 HTML 解析器被认为是不完整的,因此从 Go 1 中删除,尽管 exp 树仍在 Go 源代码树中并且可以通过例如每周标记访问。我不知道到底什么是不完整的。我曾经将它用于一个简单的任务,它满足了我的需求。

当然,还要检查仪表板并查看相关的 SO 帖子,在 Go1 之后获取 exp/html 的任何智能方法?,主要用于http://code.google.com/p/go-html-transform/的推荐

于 2012-04-05T17:56:29.123 回答
1

我害怕模板包无法解决这个问题。如果你想删除特定的(黑名单)标签(分别是由这些标签包围的子树)或只允许传递特定的标签(白名单),那么我认为可能无非就是解析和重写 html AST 可以是一个很好的解决方案。也就是说,人们可以到处看到一些疯狂的 RE 试图做同样的事情,但我不认为这是一个“好的解决方案”,我怀疑它们在符合 HTML 规范的一般情况下是否是一个“正确”的解决方案,包括几个法律违规行为,因为它可能被排除在常规语法类别问题之外。

于 2012-04-05T09:07:07.237 回答