在 Go on GAE 中显示由 html/template 生成的换行符

我的应用程序是用 Go 编写的。应用程序的一个页面从 HTML 文本区域接收用户数据,该文本区域作为字符串数据保存到 Google App Engine 数据存储区。然后,在应用程序的另一个页面上,它需要以用户在 HTML 文本区域中键入的格式显示数据,或者至少在用户在 HTML 文本字段中键入数据时按 Enter 键时保留换行符。

我尝试使用<pre>标签来显示用户在文本字段中输入的保留换行符,效果很好。然而,我发现有一个双标签

\t\t

使用<pre>标签时插入字符串的开头,我可以使用 Javascript 删除双标签。

我的主意,让换行符用户输入到文本字段是使用JavaScript替换功能全部更换\r\n\n\r<br>,但是,它没有发挥出来。Go 似乎没有将换行符输出到 html 源代码中。出于安全原因,我正在使用“html/template”,但我没想到它会\r\n从其输出中完全删除字符。\t\t对字符串开头的奇怪双标签有什么建议吗?


HUX布斯
浏览 327回答 2
2回答

缥缈止盈

不要将换行符更改为<br>javascript,而是在 Go 中进行:http : //play.golang.org/p/jJXMZxtYcvpackage mainimport (&nbsp; &nbsp; "html/template"&nbsp; &nbsp; "log"&nbsp; &nbsp; "os"&nbsp; &nbsp; "strings")func main() {&nbsp; &nbsp; const tpl = `<!DOCTYPE html><html>&nbsp; &nbsp; <head>&nbsp; &nbsp; &nbsp; &nbsp; <meta charset="UTF-8">&nbsp; &nbsp; &nbsp; &nbsp; <title>{{.Title}}</title>&nbsp; &nbsp; </head>&nbsp; &nbsp; <body>&nbsp; &nbsp; &nbsp; &nbsp; <div>{{nl2br .Text}}</div>&nbsp; &nbsp; </body></html>`&nbsp; &nbsp; check := func(err error) {&nbsp; &nbsp; &nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; log.Fatal(err)&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; funcs := template.FuncMap{&nbsp; &nbsp; &nbsp; &nbsp; "nl2br": func(text string) template.HTML {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return template.HTML(strings.Replace(template.HTMLEscapeString(text), "\n", "<br>", -1))&nbsp; &nbsp; &nbsp; &nbsp; },&nbsp; &nbsp; }&nbsp; &nbsp; t, err := template.New("webpage").Funcs(funcs).Parse(tpl)&nbsp; &nbsp; check(err)&nbsp; &nbsp; data := struct {&nbsp; &nbsp; &nbsp; &nbsp; Title string&nbsp; &nbsp; &nbsp; &nbsp; Text&nbsp; string&nbsp; &nbsp; }{&nbsp; &nbsp; &nbsp; &nbsp; Title: "My page",&nbsp; &nbsp; &nbsp; &nbsp; Text:&nbsp; "\t\tLine 1\r\nLine2\r\n",&nbsp; &nbsp; }&nbsp; &nbsp; err = t.Execute(os.Stdout, data)&nbsp; &nbsp; check(err)}

拉丁的传说

您可以简单地解决 CSS 格式问题,即white-space属性:white-space 属性指定如何处理元素内的空白。CSS 语法:white-space: normal|nowrap|pre|pre-line|pre-wrap|initial|inherit;该pre值就像被包装在一个 HTML<pre>标签中一样,这也将呈现双选项卡。使用该pre-line值对您有用:pre-line空格序列将折叠为单个空格。文本将在必要时换行,并在换行符处因此保留了行,但多个空格被折叠为一个。优点是您不需要转换原始文本,浏览器会应用正确的格式。代码对于 HTML 注入攻击仍然是安全的。完整示例:func main() {&nbsp; &nbsp; t := template.Must(template.New("").Parse(src))&nbsp; &nbsp; http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {&nbsp; &nbsp; &nbsp; &nbsp; t.Execute(w, text)&nbsp; &nbsp; })&nbsp; &nbsp; panic(http.ListenAndServe("localhost:8080", nil))}const src = `<html><body>Entered text:<div style="white-space:pre-line">{{.}}</div></body></html>`const text = "\t\t1st line\n2nd line\r\n3rdline"你最初的双标签 \t\t请注意,您的初始双标签\t\t不是由浏览器或表单提交(也不是数据存储,如果您将其存储在那里)生成,而是很可能是您使用缩进 2 个标签的模板的结果。模板的缩进也会写入输出,因此您应该正确关闭<textarea>模板中没有换行符的内容。由于您没有发布您的模板和代码,我无法帮助您找出初始双标签的原因,但您应该找到根本原因而不是治疗症状。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go