DOMParser提取纯文本再替换最安全;innerText适合人眼可见内容,textContent保留原始空白但暴露script/style;服务端用jsdom或BeautifulSoup;禁用正则硬刚HTML。

直接用 DOMParser 提取纯文本,再用字符串方法替换最安全;别碰正则硬刚 HTML 结构,99% 的“替换失败”都源于此。
用 DOMParser 提取并替换纯文本(浏览器环境)
这是处理用户可见文本的首选路径:先解析成真实 DOM,再读 innerText,最后做字符串替换。它天然跳过标签、属性、脚本、注释,不担心大小写、空格或嵌套。
-
innerText会合并空白、折行、隐藏元素内容,适合“人眼看到什么就拿什么”场景 - 若需保留原始换行/空白(比如日志、代码片段),改用
textContent,但它也会暴露<script></script>和里的内容 - 必须加兜底:
doc.documentElement?.innerText || '',避免空字符串或解析失败时抛错
function replaceInHtmlText(htmlString, search, replace) {
const parser = new DOMParser();
const doc = parser.parseFromString(htmlString, 'text/html');
const text = doc.documentElement.innerText || '';
return text.replace(search, replace);
}
只在特定标签内替换(如仅 或 )当业务要求“只改正文段落,不碰标题或侧栏”,就得定位到具体节点再操作,不能全量提取后替换——否则会丢失结构语义。
- 用
querySelectorAll 精准选中目标元素,遍历其 childNodes 中的文本节点(nodeType === Node.TEXT_NODE)
- 对每个文本节点调用
nodeValue.replace(),再用 replaceChild() 更新 DOM
- 注意:直接改
innerText 会清空子元素(比如 Hello world
Convert Markdown To HTML And PDF - Markdown和HTML、PDF互转
实现 Markdown↔ HTML 互转,支持导出 PDF,用于用户请求的文档格式转换。
下载
改完只剩纯文本),要保留结构就得逐节点处理
function replaceInPTags(htmlString, search, replace) {
const parser = new DOMParser();
const doc = parser.parseFromString(htmlString, 'text/html');
doc.querySelectorAll('p').forEach(p => {
p.childNodes.forEach(node => {
if (node.nodeType === Node.TEXT_NODE) {
const newText = node.nodeValue.replace(search, replace);
if (newText !== node.nodeValue) {
const textNode = doc.createTextNode(newText);
p.replaceChild(textNode, node);
}
}
});
});
return doc.documentElement.outerHTML;
}
服务端(Node.js / Python)替换 HTML 中的文本
没有浏览器 DOM?DOMParser 不可用。此时必须用真正能解析 HTML 的库,而不是 sed 或 str.replace。
- Node.js 推荐
jsdom:API 与浏览器一致,可直接用 querySelector + textContent
- Python 必用
BeautifulSoup:设 string=True 找纯文本节点,加 if text.parent.name not in ["script", "style"] 过滤掉危险区域
- 绝对避免
re.sub(r'(.*?)
', ...) 类正则——它无法处理换行、属性含 >、自闭合标签等合法变体
VS Code 全局替换 HTML 模板时的关键约束
编辑器里批量改类名、属性值或静态文案,靠的是“上下文可控”。一旦目标串可能出现在属性、注释或 JS 字符串里,就必须人工校验。
- 启用正则模式后,用
]*class="([^"]*)"[^>]*> 捕获 class 值,比盲目 class="old" 替换更稳
- 排除文件范围:务必填
!node_modules/**, !dist/**, *.html,防止误改构建产物
- 执行前先点“查找全部”,看匹配项是否全在预期位置;哪怕只有一处落在
href="..." 里,就得重写正则
真正难的不是“怎么写替换逻辑”,而是判断“该不该替换”——文本是否在属性里?是否属于动态渲染内容?是否跨多层嵌套?这些边界一旦模糊,任何方案都会漏或错。动手前花 30 秒看一眼原始 HTML 的实际结构,比写 10 行正则更有用。
当业务要求“只改正文段落,不碰标题或侧栏”,就得定位到具体节点再操作,不能全量提取后替换——否则会丢失结构语义。
- 用
querySelectorAll精准选中目标元素,遍历其childNodes中的文本节点(nodeType === Node.TEXT_NODE) - 对每个文本节点调用
nodeValue.replace(),再用replaceChild()更新 DOM - 注意:直接改
innerText会清空子元素(比如改完只剩纯文本),要保留结构就得逐节点处理Hello world
Convert Markdown To HTML And PDF - Markdown和HTML、PDF互转下载实现 Markdown↔ HTML 互转,支持导出 PDF,用于用户请求的文档格式转换。
function replaceInPTags(htmlString, search, replace) {
const parser = new DOMParser();
const doc = parser.parseFromString(htmlString, 'text/html');
doc.querySelectorAll('p').forEach(p => {
p.childNodes.forEach(node => {
if (node.nodeType === Node.TEXT_NODE) {
const newText = node.nodeValue.replace(search, replace);
if (newText !== node.nodeValue) {
const textNode = doc.createTextNode(newText);
p.replaceChild(textNode, node);
}
}
});
});
return doc.documentElement.outerHTML;
}
服务端(Node.js / Python)替换 HTML 中的文本
没有浏览器 DOM?DOMParser 不可用。此时必须用真正能解析 HTML 的库,而不是 sed 或 str.replace。
- Node.js 推荐
jsdom:API 与浏览器一致,可直接用querySelector+textContent - Python 必用
BeautifulSoup:设string=True找纯文本节点,加if text.parent.name not in ["script", "style"]过滤掉危险区域 - 绝对避免
re.sub(r'类正则——它无法处理换行、属性含(.*?)
', ...)>、自闭合标签等合法变体
VS Code 全局替换 HTML 模板时的关键约束
编辑器里批量改类名、属性值或静态文案,靠的是“上下文可控”。一旦目标串可能出现在属性、注释或 JS 字符串里,就必须人工校验。
- 启用正则模式后,用 ]*class="([^"]*)"[^>]*> 捕获 class 值,比盲目
class="old"替换更稳- 排除文件范围:务必填
!node_modules/**, !dist/**, *.html,防止误改构建产物- 执行前先点“查找全部”,看匹配项是否全在预期位置;哪怕只有一处落在
href="..."里,就得重写正则真正难的不是“怎么写替换逻辑”,而是判断“该不该替换”——文本是否在属性里?是否属于动态渲染内容?是否跨多层嵌套?这些边界一旦模糊,任何方案都会漏或错。动手前花 30 秒看一眼原始 HTML 的实际结构,比写 10 行正则更有用。
- 排除文件范围:务必填
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










