把貼上來的髒 HTML(尤其 Word Safari)轉成乾淨、可控的內容 - daniel-qa/Vue GitHub Wiki
現代寫法核心思路
👉 不再用「整串 regex 處理 HTML」
👉 改成「AST / DOM pipeline」
👉 regex = hack
👉 DOMParser = engineering
👉 AST = architecture
✨ 範例(重構 normalizeSpacing)
function normalizeSpacing(html) {
const parser = new DOMParser()
const doc = parser.parseFromString(html, 'text/html')
// 1️⃣ 移除 Word VML / 垃圾註解
removeComments(doc)
// 2️⃣ 處理 mso-spacerun
doc.querySelectorAll('[style*="mso-spacerun"]').forEach(el => {
if (!el.textContent.trim()) {
el.remove()
} else {
el.textContent = el.textContent.replace(/\r?\n/g, '')
}
})
// 3️⃣ 移除 <o:p>
doc.querySelectorAll('o\\:p').forEach(el => {
if (!el.textContent.trim() || el.innerHTML === ' ') {
el.remove()
}
})
// 4️⃣ 修正空白(保留 visually correct)
fixSpaces(doc.body)
// 5️⃣ 移除多餘空白節點
removeWhitespaceNodes(doc.body)
return doc.body.innerHTML
}