提问背景 Question:
那是google的写法不标准,还是内容传输过程中的问题。
Markdown解析一致性探讨
关于Goldmark及Markdown解析不一致问题,核心原因通常不在于“标准”本身,而在于规范的边界覆盖度与实现方式的差异。Markdown并非单一标准,Goldmark遵循CommonMark,但处理特定符号(如智能引号、标点、CJK字符)与粗体语法(**)相邻时,容易触发语法歧义。
问题根源分析:
- 邻接歧义:当
**紧邻中文标点或特殊引号时,解析器在判断它是“开始标记”还是“普通字符”时逻辑不统一。 - 实现分叉:虽然后端用了Goldmark,但前端JS如果使用了marked、react-markdown或其他库,它们对于
Emphasis和Strong的优先级定义可能存在细微差异。 - 传输损耗:如果内容经过多次序列化/反序列化(例如转义字符处理不当),会导致Markdown原始符号被破坏。
建议的工程解决方案:
- 全局预处理(Normalization):在发送给Goldmark前,利用正则为所有潜在的Markdown语法符号增加前后空格或零宽空格(
),显式切断歧义连接。 - 前后端对齐:放弃使用多语言解析器,尽量在前端也引入基于WASM的Goldmark(通过
goldmark-wasm),确保算法内核与后端100%一致。 - 自定义Renderer:如果必须保留特定格式,可以在Goldmark中通过实现
ast.Node的自定义渲染器(Renderer),在渲染HTML前对Token进行校验,强制修正语法格式。对于复杂文档,建议在入库前将内容转换为安全的AST结构存储,而不是仅存储Raw Markdown。