std::regex_replace是c++11中清除html/xml标签属性最直接的通用方案,推荐正则模式r"((s+w+s=s(["'])(?:1|.)?))",适用于简单片段;复杂场景应选tinyxml2等dom库。 ↩

用 std::regex_replace 清除 HTML/XML 风格的标签属性最直接
如果你面对的是类似 <div id="a" class="b" data-x="y"> 这种带多个属性的标签,想删掉所有属性(只保留标签名和尖括号),<code>std::regex_replace 是 C++11 起最可行的通用方案。它不依赖外部库,且能一次匹配整个属性片段。
关键点在于正则要覆盖:空格 + 属性名 + 可选等号 + 可选引号包裹的值(含转义、单双引号混用)。标准库的 std::regex 对 Unicode 和复杂引号嵌套支持弱,所以仅适用于简单 HTML 片段(如模板生成、日志清洗)。
- 推荐正则模式:
R"((s+w+s*=s*(["'])(?:[^\]|\.)*?)*)"—— 匹配“空格+属性=值”整体,支持单双引号及简单转义 - 替换为空字符串:
"",注意不是" "(否则会多出冗余空格) - 必须启用
std::regex_constants::ECMAScript(默认),避免某些编译器(如 MSVC)对s解析异常
手动遍历删除属性容易漏掉边界情况
有人倾向用 find/erase 循环找 = 或 ",但实际会踩一堆坑:属性值里含 =(如 style="width: 100%")、属性名后无空格(<imgsrc></imgsrc>)、自闭合标签(<br>)里的斜杠位置干扰。这些都会导致删错或死循环。
除非你明确知道输入格式极度受限(比如所有属性都用双引号、值中无 "、标签间必有空格),否则不建议手写解析逻辑。
- 遇到
<a href="x" onclick="alert('y = z')"></a>,基于=切分必然在alert('y = z')处断裂 -
substr或erase修改字符串时,迭代器/索引容易失效,尤其多次erase后未重置搜索起点 - 无法区分开始标签
<div ...> 和结束标签 <code>











