Golang解析HTML标签并将其转换为HTML模板的方法

Golang解析HTML标签并将其转换为HTML模板的方法 你好

我正在将 \n 转换为 <br> 标签,

strings.Replace(data.Message, "\n", "<br>", -1)

当我想在 HTML 模板中显示它时,<br> 标签被忽略了,不起作用,在模板中只是像文本一样显示出来。 Screenshot from 2022-02-12 16-55-26

在 HTML 模板中,我是这样渲染的:

<p style="text-align: justify;">{{.Message}}</p>

更多关于Golang解析HTML标签并将其转换为HTML模板的方法的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

您使用的是 html/template 还是 text/template

前者会对 HTML 字符进行“自动转义”,以避免注入攻击。

您可以使用 template.HTML() 来将一个字符串标记为“安全”。

func main() {
    fmt.Println("hello world")
}

更多关于Golang解析HTML标签并将其转换为HTML模板的方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Go语言中,HTML模板默认会对动态内容进行HTML转义以防止XSS攻击。要显示包含HTML标签的内容,需要使用template.HTML类型。

以下是解决方案:

import (
    "html/template"
    "strings"
)

// 在传递给模板前将字符串转换为template.HTML
func prepareMessage(message string) template.HTML {
    // 将换行符转换为<br>标签
    htmlContent := strings.ReplaceAll(message, "\n", "<br>")
    // 转换为template.HTML类型,告诉模板不要转义HTML
    return template.HTML(htmlContent)
}

// 在渲染模板前处理数据
func renderTemplate(w http.ResponseWriter, data YourData) {
    tmpl, err := template.ParseFiles("template.html")
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    
    // 处理Message字段
    data.Message = prepareMessage(data.Message)
    
    err = tmpl.Execute(w, data)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
    }
}

在模板中直接使用{{.Message}}

<p style="text-align: justify;">{{.Message}}</p>

或者,如果需要在模板内部处理,可以使用template.HTML类型字段:

type PageData struct {
    Message template.HTML
}

// 使用
data := PageData{
    Message: template.HTML(strings.ReplaceAll(rawMessage, "\n", "<br>")),
}

注意:只有当您完全信任内容来源时才应使用template.HTML,因为它会绕过HTML转义的安全防护。如果内容来自用户输入,建议先使用html/template包进行适当的清理。

回到顶部