提问背景 Question:
没有正确显示,你能不能换个方式发给我
解决Go中字面量\n转义导致Markdown解析失败
抱歉,由于之前排版转义的原因导致代码显示不完整。这里为您重新梳理,使用 Go 语言的原始字符串(反引号 `) 来编写替换逻辑,这样可以完全避免反斜杠在 Go 编译器和 JSON 传输中的多重转义混淆。
根本问题所在
在您的数据库中,换行符被保存为了字符 \ 和 n(即字面量 ,共两个字符),而不是一个真正的换行控制符(ASCII 10)。Goldmark 解析器必须依赖真正的换行控制符来识别段落、标题和列表。
修复后的 ConvertMarkdown 函数
请将您的后台代码修改为以下实现。注意看第一步和第二步中,我们使用了反引号:
func ConvertMarkdown(mdContent string) template.HTML {
// 1. 将文本中字面上的两个字符 "\
" 替换为真正的换行符 "
"
// 这里使用 Go 的原始字符串(反引号),可以直观地表示字面量,防止转义混淆
mdContent = strings.ReplaceAll(mdContent, `
`, "
")
// 2. 同样处理 Windows 平台可能产生的字面量 "\
"
mdContent = strings.ReplaceAll(mdContent, `
`, "
")
// 3. 将 Windows 的
统一转换为 Linux 的
(可选,保证兼容性)
mdContent = strings.ReplaceAll(mdContent, "
", "
")
var buf bytes.Buffer
if err := goldmark.Convert([]byte(mdContent), &buf); err != nil {
return template.HTML(mdContent) // 如果解析失败,回退返回原始文本
}
return template.HTML(buf.String())
}
为什么这样写可以解决?
- 在 Go 中,
` `表示由字符\和字符n组成的双字符字符串。 " "表示只有一个换行控制符(ASCII 10)的单字符字符串。- 通过
strings.ReplaceAll(mdContent,
, " "),程序就会把文本中所有纯文本显示的转换为系统能识别的真实换行符,从而让 Goldmark 正确解析出<h3>、<li>等 HTML 标签。