正则提取HTML标签内容仅适用于简单、格式固定的场景,需用非贪婪匹配和dotall模式处理换行,支持反向引用确保标签闭合,但无法可靠处理嵌套、属性含>、注释等复杂情况,生产环境应优先使用HTML解析器。

直接用正则提取 HTML 标签内容风险高、不推荐用于复杂或嵌套结构,但对简单、格式固定的场景(如纯文本标签、无属性、无嵌套)可快速实现。关键在于匹配标签边界并捕获中间内容。
基础写法:提取单个标签的文本内容
例如提取 <p>Hello</p> 中的 Hello:
正则模式:<p>(.*?)</p>
-
<p>匹配字面量开始标签 -
(.*?)非贪婪捕获任意字符(含空格、换行),括号表示要提取的内容 -
</p>匹配字面量结束标签
注意:若 HTML 含换行,需启用 dotall 模式(Python 中加 re.DOTALL,JS 中用 /s 标志),否则 . 不匹配换行符。
立即学习“前端免费学习笔记(深入)”;
支持常见标签名:用分组或字符类泛化
想同时匹配 <h1>、<div>、<span> 等:
正则模式:<(h1|div|span)>(.*?)</\1>
-
(h1|div|span)匹配并捕获标签名 -
</\1>用反向引用确保起止标签一致(避免<div>...</span>错误匹配) - 仍需非贪婪
.*?,防止跨标签误吞
跳过属性和自闭合标签的干扰
真实 HTML 常含属性(如 <img src="x">)或自闭合标签(<br/>),它们会破坏简单模式:
- 带属性的开始标签如
<p class="intro">,需扩展为<p\b[^>]*>(.*?)</p>(\b防止匹配到<p1>,[^>]*容忍任意属性) - 自闭合标签(
<br/>、<img ... />)没有内容,无需捕获,也不应被当作“开始标签”参与匹配 - 避免用
.*替代.*?,否则可能从第一个<p>一直匹配到最后一个</p>,吞掉中间所有标签
更安全的替代方案:优先用 HTML 解析器
正则无法可靠处理嵌套(如 <div><p>A</p></div>)、注释(<!-- ... -->)、CDATA 或属性中含 > 的情况(<tag attr="a>b">)。
- Python 推荐
BeautifulSoup:soup.find('p').get_text() - JavaScript 推荐
DOMParser:new DOMParser().parseFromString(html, 'text/html').querySelector('p').textContent - 命令行可用
pup(echo '<p>X</p>' | pup 'p text{}')
正则适合临时脚本、日志清洗、已知格式的简单提取;生产环境涉及用户输入或未知 HTML 结构时,务必改用专用解析器。



















