0

0

基于Golang的简易HTML压缩器_去除多余空格与注释

P粉602998670

P粉602998670

发布时间:2026-03-06 08:56:02

|

259人浏览过

|

来源于php中文网

原创

go中用golang.org/x/net/html解析html需注意:跳过注释节点、仅在非预格式化上下文规整文本空格、用html.render输出避免自闭合标签错误、脚本样式内容禁用压缩。

基于golang的简易html压缩器_去除多余空格与注释

Go 里用 golang.org/x/net/html 解析 HTML 容易卡在注释节点

HTML 注释(<!-- ... -->)在 golang.org/x/net/html 中是独立的 html.CommentNode 类型,但默认遍历器不会跳过它——结果就是压缩后注释原样保留,甚至可能因节点顺序错乱导致闭合标签错位。

实操建议:

立即学习go语言免费学习笔记(深入)”;

  • 遍历 DOM 树时,对每个 node.Type == html.CommentNode 的节点直接 continue 或设为 nil
  • 别依赖 node.Data 做字符串替换,注释内容在 node.Data 里不带 <!---->,手动拼接容易出错
  • 注意 html.Parse 默认不合并相邻文本节点,连续空格或换行可能被拆成多个 html.TextNode,得在遍历中主动合并

strings.TrimSpace 不能直接用于 HTML 文本节点压缩

直接对每个 html.TextNodenode.Data 调用 strings.TrimSpace 会误杀内联样式里的空格、<pre class="brush:php;toolbar:false;"></pre><code> 里的有意义空白,而且无法处理标签间的“间隙空格”(比如 <div> <span> 中的空格)。<p>实操建议:</p> <p><span>立即学习</span>“<a href="https://pan.quark.cn/s/00968c3c2c15" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">go语言免费学习笔记(深入)</a>”;</p> <ul> <li>只对非预格式化上下文(即不在 <code><pre class="brush:php;toolbar:false;"></pre><textarea></textarea><script></script><style></style> 内)的文本节点做空格规整

  • 用正则 regexp.MustCompile(`\s+`) 替换为单个空格,再 trim 首尾,比 TrimSpace 更可控
  • 标签之间(如
  • )的空白不属于任何文本节点,需在序列化前检查相邻节点类型并插入/删除空格

    输出时用 html.Render 而不是字符串拼接,否则自闭合标签会出错

    手写 fmt.Sprintf 拼 HTML 标签,很容易把 <img alt="基于Golang的简易HTML压缩器_去除多余空格与注释" ><br> 这类自闭合标签写成 <img alt="基于Golang的简易HTML压缩器_去除多余空格与注释" >,浏览器虽能容错,但不符合标准且可能影响后续解析。

    Dreamhouse AI
    Dreamhouse AI

    AI室内设计,快速重新设计你的家,虚拟布置家具

    下载

    实操建议:

    立即学习go语言免费学习笔记(深入)”;

    • 必须用 html.Render 输出,它会查 html.IsVoidElement 判断是否自闭合
    • 若要定制输出(如不换行、不缩进),传入自定义 html.Renderer,而非改写节点结构
    • 注意 html.Render 默认会转义 、<code>>&,如果原始 HTML 已含实体(如  ),重复转义会导致显示异常——此时应先解码再渲染,或跳过已知安全内容

    压缩后 document.write 或内联脚本可能失效

    某些老式前端代码依赖标签间空格或换行来分隔 JS 字符串拼接(比如 document.write('<div>'+a+'</div>')),压缩后连续标签连在一起,可能导致 JS 解析错误;更常见的是内联 onclick="foo()" 末尾多出空格被删,触发 IE8 兼容模式下的事件丢失。

    实操建议:

    立即学习go语言免费学习笔记(深入)”;

    • <script></script><style></style> 节点内容不做任何空白处理,原样保留
    • 检测 node.Parent != nil && node.Parent.Data == "script",跳过其所有子文本节点的压缩逻辑
    • 如果 HTML 来源不可控,建议加开关,默认禁用脚本/样式内容压缩,避免上线后偶发交互中断

    真正麻烦的不是删空格,而是判断“哪里的空格能删、哪里删了会影响运行时行为”。尤其混合了模板语法(如 {{.Name}})或服务端 include 的 HTML,压缩器根本没法知道哪些空白是语义性的。

    热门AI工具

    更多
    DeepSeek
    DeepSeek

    幻方量化公司旗下的开源大模型平台

    豆包大模型
    豆包大模型

    字节跳动自主研发的一系列大型语言模型

    通义千问
    通义千问

    阿里巴巴推出的全能AI助手

    腾讯元宝
    腾讯元宝

    腾讯混元平台推出的AI助手

    文心一言
    文心一言

    文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

    讯飞写作
    讯飞写作

    基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

    即梦AI
    即梦AI

    一站式AI创作平台,免费AI图片和视频生成。

    ChatGPT
    ChatGPT

    最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

    相关专题

    更多
    golang如何定义变量
    golang如何定义变量

    golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

    209

    2024.02.23

    golang有哪些数据转换方法
    golang有哪些数据转换方法

    golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

    245

    2024.02.23

    golang常用库有哪些
    golang常用库有哪些

    golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

    354

    2024.02.23

    golang和python的区别是什么
    golang和python的区别是什么

    golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

    214

    2024.03.05

    golang是免费的吗
    golang是免费的吗

    golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

    407

    2024.05.21

    golang结构体相关大全
    golang结构体相关大全

    本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

    449

    2025.06.09

    golang相关判断方法
    golang相关判断方法

    本专题整合了golang相关判断方法,想了解更详细的相关内容,请阅读下面的文章。

    200

    2025.06.10

    golang数组使用方法
    golang数组使用方法

    本专题整合了golang数组用法,想了解更多的相关内容,请阅读专题下面的文章。

    1335

    2025.06.17

    Rust内存安全机制与所有权模型深度实践
    Rust内存安全机制与所有权模型深度实践

    本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

    4

    2026.03.05

    热门下载

    更多
    网站特效
    /
    网站源码
    /
    网站素材
    /
    前端模板

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    Bootstrap 5教程
    Bootstrap 5教程

    共46课时 | 3.5万人学习

    AngularJS教程
    AngularJS教程

    共24课时 | 4万人学习

    CSS教程
    CSS教程

    共754课时 | 39.8万人学习

    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号 技术交流群
    PHP中文网订阅号
    每天精选资源文章推送

    Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号