我的应用程序是用Go编写的。应用程序的页面从HTML文本区域接收用户数据,该文本区域作为字符串数据保存到Google App Engine数据存储区。然后,在应用程序的另一页上,它需要以用户键入HTML文本区域的格式显示数据,或者至少在用户按下输入键时保留换行符,同时在HTML文本字段中键入数据。
我尝试使用<pre>
标记来显示用户在文本字段中输入的保留换行符,该换行符运行正常。但是,我发现有一个双标签
\吨\吨
在使用<pre>
标记时插入字符串的开头,我可以使用Javascript删除双标签。
我想保留用户在文本字段中输入的换行符是使用javascript替换函数将所有\r\n
,\n
和\r
替换为<br>
,然而,它没有成功。看起来Go并没有将换行输出到html源代码中。我正在使用&#34; html / template&#34;出于安全原因,但我并不期望它完全从输出中删除\r\n
个字符。在字符串的开头有奇怪的双重标签\t\t
是否有任何建议?
答案 0 :(得分:3)
您可以使用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() {
t := template.Must(template.New("").Parse(src))
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
t.Execute(w, text)
})
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>
。由于你没有发布你的模板和代码,我找不到为什么你有初始的双标签,但是你应该找到根本原因而不是治疗症状。
答案 1 :(得分:2)
不要在javascript中将换行符更改为<br>
,而是在Go中执行:http://play.golang.org/p/jJXMZxtYcv
package main
import (
"html/template"
"log"
"os"
"strings"
)
func main() {
const tpl = `
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>{{.Title}}</title>
</head>
<body>
<div>{{nl2br .Text}}</div>
</body>
</html>`
check := func(err error) {
if err != nil {
log.Fatal(err)
}
}
funcs := template.FuncMap{
"nl2br": func(text string) template.HTML {
return template.HTML(strings.Replace(template.HTMLEscapeString(text), "\n", "<br>", -1))
},
}
t, err := template.New("webpage").Funcs(funcs).Parse(tpl)
check(err)
data := struct {
Title string
Text string
}{
Title: "My page",
Text: "\t\tLine 1\r\nLine2\r\n",
}
err = t.Execute(os.Stdout, data)
check(err)
}