html2text 不适合多次复用同一实例,需每次 new 新对象;默认 iso-8859-1 编码,不支持 utf-8 中文及 html 实体自动解码,须手动转码和解码;忽略 换行,需预处理;不处理 css 隐藏内容;推荐 strip_tags、nineteenfeet/nf-html-to-text 或 league/html-to-markdown 替代。

html2text/html2text 包不是“轻松搞定”的选项——它在 PHP composer require html2text/html2text 为什么总报错
根本原因不是包不存在,而是 Composer 默认拉取 v2.x,而该版本要求 PHP ≥ 8.0 且内部改写了 DOMDocument 的调用方式(移除了别名兼容)。如果你的环境是 PHP 7.4 或 8.0 以下:
- 必须显式指定旧版:
composer require html2text/html2text:^1.4 - 确认
ext-dom已启用:Linux/macOS 通常默认开启;Windows 用户需检查php.ini中extension=dom是否取消注释 - 若仍报
Class 'DOMDocument' not found,说明扩展未加载成功,和包无关
Html2Text\Html2Text 实例化时踩的坑
装完不等于能用。这个类不支持全局单例或链式调用,每次转换都得新建实例,且内部状态不清除:
- 必须用完整命名空间:
use Html2Text\Html2Text;,不能只写new Html2Text() - 基础转换写法:
$text = (new Html2Text($html))->getText(); - 多次复用同一实例可能返回上一次残留的空白或配置,建议每次 new 一个新对象
- 默认保留大量换行与缩进,如需紧凑文本,得后处理:
trim(preg_replace('/\s+/', ' ', $text))
中文乱码、实体丢失?不是 bug 是设计限制
html2text v1.x 默认按 ISO-8859-1 解析 HTML,对 UTF-8 中文完全无感知,也不自动解码 HTML 实体:
使用 PptxGenJS 和 Python 解析,将结构化的 HTML/CSS 幻灯片内容转换为原生、可编辑的 PowerPoint(.pptx)演示文稿。
- 输入前必须确保是 UTF-8 字符串:
mb_convert_encoding($html, 'UTF-8', 'auto')或用mb_detect_encoding()校验 - 手动解码实体:
$html = html_entity_decode($html, ENT_QUOTES, 'UTF-8'); -
<br>、<p></p>这类换行标签它基本忽略,建议预处理:str_replace(['<br>', '<br>', '<p>'], "\n", $html)</p> - 它不执行 CSS 渲染逻辑,
display: none的内容照常提取——这不是缺陷,是能力边界
比 html2text 更靠谱的替代方案
如果只是去标签、保段落、兼容中文,优先考虑语言内置方案或更轻量的第三方库:
- 简单结构用
strip_tags()+ 正则补空行:preg_replace(['//i', '/<br>/i'], "\n", $html)
,再套一层strip_tags() - 需要语义还原(列表缩进、标题分级),用
nineteenfeet/nf-html-to-text:composer require nineteenfeet/nf-html-to-text,它默认 UTF-8 友好,自动过滤<script></script>、<style></style>,且不依赖 DOM 扩展 - 若后续还要转 Markdown,直接上
league/html-to-markdown,它底层健壮,对实体、编码、嵌套处理更成熟
strip_tags,还是引入一个带测试覆盖率的解析器。前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










