2015-07-02 50 views
-4

我曾嘗試使用以下行管理輸出文本:如何在Go中轉換原始HTML?

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

但這將字面上輸出HTML標籤。你如何輸出它,所以它可以安全地包含在HTML中,就像在PHP中使用echo一樣?

+0

go中的模板使用起來非常簡單,我甚至不會用任何其他方式輸出html。 – SBI

+0

我正在嘗試創建一個web服務器 – matt

+2

請看http://golang.org/pkg/html/template/ - 您應該將數據呈現給模板。模板/ html庫還負責安全地處理「用戶數據」以避免XSS。 http://jan.newmarch.name/go/template/chapter-template.html是學習軟件包的好的入門書。 – elithrar

回答

4

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; 
0

這裏的問題不是我使用的輸出方法。簡而言之,瀏覽器將其視爲純文本而不是html。因此你需要告訴瀏覽器它是html。

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

此功能只是將內容類型設置爲html。