首页 > 解决方案 > 换行到

问题描述

我正在尝试在我的 Golang 模板中将我的“ \n”转换为“ ”。<br/>

type Page struct {
    HTTPMethod      string
    Template        string
    CharSet         string
    Slug            string
    MetaTitle       string
    MetaDescription string
    MetaKeywords    string
    Title           string
    Body            string
    Navigation      Links
    Detail          interface{}
}

for _, page := range pages.Pages {
    page := page
    router.HandleFunc(page.Slug, func(w http.ResponseWriter, r *http.Request) {
        err := tmpl.ExecuteTemplate(w, page.Template, page)// page of type Page
        if err != nil {
            http.Error(w, err.Error(), http.StatusInternalServerError)
        }
    })
}

模板如下所示:

{{define "index"}}{{template "header" . }}<h1>{{.Title}}</h1><div>{{.Body}}</div>{{template "footer"}}{{end}}

我试图将字符串与:

page.Body = "Some text." +htmlBRTag+ "More text"

输出以下内容:

htmlBRTag := "&lt;br/&gt;" // -> &lt;br/&gt;
htmlBRTag = "<br/>" //-> <br/>

预期结果将是:

page.Body = "Some text.<br/>More text"

任何建议如何做到这一点?

以下是开箱即用的可复制代码:

package main

import (
    "fmt"
    "html/template"
    "log"
    "net/http"

    "github.com/gorilla/handlers"
    "github.com/gorilla/mux"
)

type Data struct {
    Field1 string
    Field2 string
    Field3 string
}

var tmpl *template.Template

func main() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Printf("Recovering from panic, error is: %v \n", r)
        }
    }()
    router := mux.NewRouter()

    port := ":8085"
    htmlBreak := "<br/>"
    data := Data{}
    data.Field1 = "Some text<br/>More text"
    data.Field2 = "Some text" + htmlBreak + "More text"
    data.Field3 = template.HTMLEscapeString(data.Field2)

    router.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        err := tmpl.ExecuteTemplate(w, "index", data)
        if err != nil {
            http.Error(w, err.Error(), http.StatusInternalServerError)
        }
    })

    var err error
    tmpl, err = template.ParseGlob("views/*")
    if err != nil {
        panic(err.Error())
    }

    router.PathPrefix("/").HandlerFunc(func(res http.ResponseWriter, req *http.Request) {
        http.FileServer(http.Dir("./static/")).ServeHTTP(res, req)
    })

    fmt.Println("Server running on localhost" + port)

    err = http.ListenAndServe(port, handlers.CompressHandler(router))
    if err != nil {
        log.Fatal(err)
    }
}

在 ./views 文件夹中,我有 index.html、index.html、footer.html

{{define "header"}}<!doctype html><html lang="en"><head><meta charset="utf-8"><title>Title</title></head><body>{{end}}

{{define "index"}}{{template "header" . }}
<div>F1: {{.Field1}}</div>
<div>F2: {{.Field2}}</div>
<div>F3: {{.Field3}}</div>
{{template "footer"}}{{end}}

{{define "footer"}}</body></html>{{end}}

当前输出为:

F1: Some text<br/>More text
F2: Some text<br/>More text
F3: Some text&lt;br/&gt;More text

预期的结果是一个换行符,如:

Some text
More text

我尝试了以下方法:

htmlBRTag := "<br/>"
b = "Some text." +htmlBRTag+ "More text"
Page.Body = template.HTMLEscapeString(b)

模板中的文本变为:

Some text.&lt;br/&gt;More text

标签: htmlgotemplatesnewlineline-breaks

解决方案


您可能需要考虑使用正则表达式,该表达式只需将所有 \n 替换为 <br/>

为此,您的代码将如下所示

package main

import (
    "regexp"
    "fmt"
)

func main() {
    var re = regexp.MustCompile(`(?m)\n`)
    var substitution = "<br/>"


    var str = `here is some text
    that have 
    newline characters`
    
    
    fmt.Println(re.ReplaceAllString(str, substitution))
}

你可以在这里玩正则表达式:https ://regex101.com/codegen?language=golang


推荐阅读