你如何在Go中逃避原始HTML?

时间:2015-07-02 06:52:18

标签: html go escaping

我已设法使用以下行输出文本:

fmt.Fprintf(w, "<p>some text</p>")

但这会输出HTML标签。如何输出它,以便像在PHP中使用echo一样安全地包含在HTML中?

2 个答案:

答案 0 :(得分:3)

fmt.Fprintf()不了解HTML语法:它输出原始数据而不转义它(它可能会进行一些格式化但不会转义)。

你没有正确使用它:它的第二个参数是一个格式字符串,所以你应该这样调用它:

fmt.Fprintf(w, "%s", "<p>some text</p>")

否则,如果您的文本包含某些特定于格式的特殊字符,则无法获得预期的结果。

您想要的是转义HTML代码,以便它可以安全地包含在HTML文档/页面中。为此,您可以从html/template软件包中获得极大的支持,该软件包为您提供了强大的模板引擎,其中自动转义功能只是一个功能。

以下是如何实现目标的简单示例:

w := os.Stdout

text := "<p>some text</p>"
fmt.Fprintf(w, "%s\n", text)

tt := `{{.}}`
t := template.Must(template.New("test").Parse(tt))
t.Execute(w, text)

输出(在Go Playground上尝试):

<p>some text</p>
&lt;p&gt;some text&lt;/p&gt;

另请注意,如果您只想转义某些HTML代码,则可以使用template.HTMLEscaper()函数:

fmt.Println(template.HTMLEscaper(text))

输出:

&lt;p&gt;some text&lt;/p&gt;

答案 1 :(得分:1)

这里的问题不是我使用的输出方法。简而言之,浏览器将其视为纯文本而非html。因此,您需要告诉浏览器它是html。

 w.Header().Set("Content-Type", "text/html")

此功能只是将内容类型设置为html。