英文:
How do you escape raw HTML in Go?
问题
我已经成功使用以下代码输出文本:
fmt.Fprintf(w, "<p>some text</p>")
但是这样会直接输出 HTML 标签。你想知道如何安全地输出文本,使其可以像在 PHP 中使用 echo
一样包含在 HTML 中吗?
英文:
I have managed to output text using the following line:
fmt.Fprintf(w, "<p>some text</p>")
But this will literally output the HTML tags. How do you output it so it can safely be included in HTML like you would with echo
in PHP?
答案1
得分: 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>
<p>some text</p>
另外请注意,如果你只想转义一些HTML代码,可以使用template.HTMLEscaper()
函数:
fmt.Println(template.HTMLEscaper(text))
输出结果:
<p>some text</p>
英文:
fmt.Fprintf()
has no knowledge of HTML syntax: it outputs raw data without escaping it (it may do some formatting but that is not escaping).
You don't use it correctly though: its second parameter is a format string, so you should call it rather like this:
fmt.Fprintf(w, "%s", "<p>some text</p>")
Else if your text contains some format-specific special characters, you will not get the expected result.
What you want is to escape HTML code so it can be safely included in HTML documents/pages. For that you get excellent support from the html/template
package which provides you a powerful template engine where automatic escaping functionality being just one feature.
Here's a simple example how to achieve what you want:
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)
Output (try it on the Go Playground):
<p>some text</p>
&lt;p&gt;some text&lt;/p&gt;
Also note that if you only want to escape some HTML code, there is a template.HTMLEscaper()
function for that:
fmt.Println(template.HTMLEscaper(text))
Output:
&lt;p&gt;some text&lt;/p&gt;
答案2
得分: 1
这里的问题不是我使用的输出方法。实际上,浏览器将其视为纯文本而不是HTML。因此,你需要告诉浏览器它是HTML。
w.Header().Set("Content-Type", "text/html")
这个函数只是将内容类型设置为HTML。
英文:
The problem here was not the output method that i used. Atchaully, the browser is seeing it as plain text instead of html. Therefore you need to tell the browser that it is html.
w.Header().Set("Content-Type", "text/html")
This function simply sets the content type to html.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论