2012-04-05 46 views
1

將[]字節傳遞到模板中作爲論壇式web應用程序中消息帖子的主體。在模板中,調用一個方法來轉換爲字符串,並一路走來,切換出所有的換行符換行:使用Go的html /模板免除轉義白名單標籤

<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模板軟件包將僅用於格式化的一些標籤列入白名單?

回答

2

我的確認爲你想解析HTML。例如,exp/html中的HTML解析器被認爲是不完整的,因此從Go 1中移除,儘管exp樹仍然在Go源樹中,並且可以按周標籤訪問。我不知道什麼是不完整的。我曾經用它做過一個簡單的任務,它滿足了我的需求。

同樣的過程中,檢查dashboard,看看相關的SO後,Any smart method to get exp/html back after Go1?,多爲中http://code.google.com/p/go-html-transform/

+1

曾經有一次,它遇到了帶有'<'標籤的javascript標籤。我不知道它是否仍然存在,但是代碼中充滿了HTML解析規範各個部分的TODO項目。 – 2012-04-05 19:11:15

+0

謝謝,我將調查go-html-transform。畢竟,Go需要它自己的BeautifulSoup ... – 2012-04-05 22:09:16

+0

修補程序也歡迎go-html-transform,以及如果你覺得它需要一些調整:-) – 2012-04-06 01:07:36

1

我很害怕模板包不能幫助太多。如果你想刪除特定的(黑名單)標籤(或者這些標籤所包含的子樹),或者只允許傳遞特定的標籤(白名單),那麼我認爲可能無非是解析和重寫html AST是一個好的解決方案。也就是說,人們可以在這裏和那裏看到一些瘋狂的RE試圖做同樣的事情,但我不認爲這是一個「好的解決方案」,我懷疑他們可以成爲符合規格的HTML一般情況下的「正確」解決方案,包括一些法律上的違規行爲,因爲它可能排除了正規的語法範疇問題。

+0

謝謝你的提示答案recomendation。我選擇了索尼婭的,但你的也很有用。 – 2012-04-05 22:09:59