Simple HTML DOM 不支持 Composer 安装,因其未发布到 Packagist 且无 composer.json;第三方镜像包已停更、不兼容 PHP 8+,易报 mb_convert_encoding 或 Undefined index 错误;推荐改用 symfony/dom-crawler + symfony/css-selector。

Simple HTML DOM 不支持 Composer 安装 —— 它没有发布到 Packagist,也没有维护 composer.json,强行用 composer require 会报 Could not find package 错误。
为什么 composer require sunra/php-simple-html-dom-parser 失败?
这个包是第三方非官方镜像,早已停止更新(最后一次提交在 2016 年),且与现代 PHP 版本(尤其是 PHP 8+)不兼容。运行时大概率触发 Fatal error: Uncaught Error: Call to undefined function mb_convert_encoding() 或 Undefined index: href 类错误。
- 原始项目
simplehtmldom由sourceforge托管,从未迁移到 GitHub/GitLab,也未注册 Packagist - 所有“Composer 可安装”的 fork 均无人维护,
mbstring、iconv扩展依赖未声明,autoload 机制也不标准 - 它的解析逻辑基于字符串替换和正则,不是真正的 DOM 树,PHP 7.4+ 的严格模式下容易崩
替代方案:用 symfony/dom-crawler + symfony/css-selector
这是目前最稳妥的 Composer 友好方案,底层使用 PHP 内置 DOMDocument,兼容 PHP 7.4–8.3,支持完整 CSS 选择器语法,内存更可控。
- 安装命令:
composer require symfony/dom-crawler symfony/css-selector - 基础用法示例(读取 HTML 字符串并提取所有链接):
$html = file_get_contents('https://example.com');
$crawler = new \Symfony\Component\DomCrawler\Crawler($html);
$links = $crawler->filter('a[href]')->each(function (\Symfony\Component\DomCrawler\Crawler $node) {
return $node->attr('href');
});
- 注意:
DOMDocument默认会补全 HTML 结构(比如自动加),若需原始片段解析,可传入LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD选项
如果必须用原版 Simple HTML DOM(如遗留代码迁移)
只能手动引入,不能走 Composer 自动加载。
立即学习“前端免费学习笔记(深入)”;
- 下载地址:
https://sourceforge.net/projects/simplehtmldom/files/(选simple_html_dom.php最新版) - 放入项目目录(例如
vendor/simplehtmldom/simple_html_dom.php) - 在使用前
require_once,不要指望autoload自动识别:
require_once __DIR__ . '/vendor/simplehtmldom/simple_html_dom.php';
$html = str_get_html('');
echo $html->find('a', 0)->href; // 输出 test
- 关键限制:不能在命名空间内直接用
$html->find(),因为类定义无命名空间;若项目启用了 strict_types,需在引入前关闭(或确保文件开头无declare(strict_types=1)) - 它不支持流式解析,大 HTML(>2MB)容易 OOM,务必配合
libxml_use_internal_errors(true)抑制警告
真正麻烦的从来不是“怎么装”,而是装完之后发现它在 PHP 8.1 上 parse 错误、在 UTF-8 页面里乱码、或者被静态分析工具标满红色。用现代组件不是为了时髦,是少 debug 三小时。











