正则表达式适合提取结构简单、格式稳定的属性值,如HTML片段中的src、data-*等,但不推荐解析完整HTML/XML;需注意引号匹配、转义、多行及嵌套等陷阱,建议优先使用DOM解析器。
正则表达式可以提取特定属性值,但需注意:它适合结构简单、格式稳定的文本(如 html 片段、配置行、日志字段),不推荐用于解析完整 html/xml 文档(应使用 dom 解析器)。关键在于准确描述属性名、等号、引号及值内容的模式。
基础写法:匹配带引号的属性值
例如从 src="https://example.com/image.jpg" 中提取 URL:
-
模式:
src\s*=\s*["']([^"']*)["'] -
说明:
\s*匹配任意空白(含无空格);["']匹配单引号或双引号;([^"']*)捕获引号内非引号字符(即目标值) - 注意:该模式不支持嵌套引号或转义引号(如 alt="He said \"Hi\""),此时正则会提前截断
处理无引号属性值(HTML5 允许)
如 disabled checked data-id=123 中的 123:
-
模式:
data-id\s*=\s*(\w+)(仅匹配字母数字下划线) - 若值可能含短横线或点(如 version=2.1.0),改用:
version\s*=\s*([\w.-]+) - 更稳妥方式(兼容有/无引号):
version\s*=\s*["']?([^"'\s>]+)["']?,其中[^"'\s>]排除引号、空格和标签结束符
提取多个同名属性或动态属性名
当需提取所有 data-* 属性值,或不确定属性名时:
-
通用 data 属性:
data-[\w-]+\s*=\s*["']([^"']*)["'],用全局标志(g)多次匹配 -
捕获属性名和值:
(\w+)\s*=\s*["']([^"']*)["'],分组1是属性名,分组2是值,适用于键值对格式文本 - 实际使用中建议限制上下文,例如加前缀
<div> 或后缀 <code>\s*>,避免误匹配注释或 JS 字符串常见陷阱与替代建议
正则提取属性易出错的场景:
- HTML 中属性值含未转义引号(title="He said "Hi"")→ 正则无法正确识别边界
- 属性跨多行、含换行符或注释 → 需启用
s(dotall)标志,但仍不可靠 - 嵌套结构(如 <div onclick="foo("a")">)→ 正则难以处理转义和嵌套引号
-
替代方案:对真实 HTML,优先用浏览器 DOM API(
element.getAttribute())、或 Python 的 BeautifulSoup、JavaScript 的DOMParser

















