为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
HUX布斯 2021-12-27 15:04:40
我的应用程序是用 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对字符串开头的奇怪双标签有什么建议吗?
查看完整描述

2 回答

?
缥缈止盈

TA贡献2041条经验 获得超4个赞

不要将换行符更改为<br>javascript,而是在 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)

}


查看完整回答
反对 回复 2021-12-27
?
拉丁的传说

TA贡献1789条经验 获得超8个赞

您可以简单地解决 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>模板中没有换行符的内容。由于您没有发布您的模板和代码,我无法帮助您找出初始双标签的原因,但您应该找到根本原因而不是治疗症状。


查看完整回答
反对 回复 2021-12-27
  • 2 回答
  • 0 关注
  • 326 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信