j0k3r/php-readability是fxp/php-readability的现代替代品,修复了PHP 8兼容性、升级Guzzle至v7+、重构DOM解析逻辑,支持PHP 7.4–8.3,需传入完整URL以确保资源路径正确,适用于语义化HTML正文提取。

PHP-Readability 库已停止维护,官方仓库(fxp/php-readability)自 2019 年起不再更新,且与现代 PHP(8.0+)及主流依赖存在兼容性问题;直接 composer require fxp/php-readability 很可能失败或运行报错。
为什么 composer require fxp/php-readability 会失败
该库依赖已废弃的 guzzlehttp/guzzle v6 以下版本、硬编码使用已被移除的 DOMDocument::loadHTML() 错误抑制符(@),且未声明对 PHP 8 的支持。Composer 在解析依赖时会因版本冲突或平台约束直接拒绝安装。
- 常见错误信息:
Root composer.json requires fxp/php-readability ^3.0 -> satisfiable by fxp/php-readability[3.0.0]后跟一堆conflict提示 - 即使强制指定旧 PHP 版本(如 7.4),也会在运行时报
Call to undefined method DOMDocument::loadHTMLFile()(实际方法名是loadHTMLFile,但库里写成了loadHTMLFile的变体拼写) - 其内部使用的
masterminds/html5v1.x 无法处理现代 HTML5 自闭合标签(如<img>),导致正文提取错乱
替代方案:改用 actively-maintained jonnyw/php-webkit-html2pdf 不可行,应选 j0k3r/php-readability
社区已有可靠 fork:由 j0k3r 维护的 j0k3r/php-readability,修复了 PHP 8 兼容性、升级 Guzzle 到 v7+、重构 DOM 解析逻辑,并保持 API 高度兼容原库。这是目前唯一能稳定工作的替代品。
- 安装命令:
composer require j0k3r/php-readability - 它自动适配 PHP 7.4–8.3,且不强制要求
ext-dom开启(fallback 到字符串解析) - 初始化方式几乎一致:
$readability = new \J0k3r\Readability\Readability($html, $url); - 注意:它默认不启用图片提取,需手动调用
->withImages(true)才解析<img>标签
实际提取正文时必须传入完整 URL,否则图片和相对链接会失效
PHP-Readability 类(无论原版还是 fork)内部会基于传入的 $url 重写页面内所有相对路径(如 src="/images/logo.png" → src="https://example.com/images/logo.png")。若只传空字符串或 null,则所有资源路径丢失,->getContent() 返回的 HTML 将无法正确渲染。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 正确做法:
$readability = new \J0k3r\Readability\Readability($html, 'https://example.com/article/123'); - 若原始 HTML 来自 cURL,务必把请求 URL 一并传入,不要用
http://localhost或占位符代替 - 遇到 404 页面或 JS 渲染页,先用
file_get_contents()或 Guzzle 获取完整 HTML 字符串,再传入 —— 它不做网络请求,只做解析
提取结果为空?检查 HTML 是否含有效 和语义化结构
该库依赖 HTML 的结构特征(如 <article></article>、<section></section>、高密度文本的 <p></p> 块)进行权重打分。纯 div 布局、大量 inline-style、或被 JavaScript 动态注入内容的页面,大概率返回空或片段。
- 调试技巧:先用
$readability->getOriginalDom()->saveHTML()看是否成功加载 DOM(若返回空,说明 HTML 解析失败) - 若 DOM 加载正常但
->getContent()为空,尝试调用->getByline()或->getTitle()—— 这些字段有时比正文更稳定 - 对 SPA 页面,必须在服务端预渲染(如 Puppeteer + PHP bridge),不能直接喂给
php-readability
真正卡住的地方往往不是 Composer 命令本身,而是 HTML 源质量、URL 上下文缺失、或对库能力边界的误判 —— 它不是万能网页快照工具,而是针对「传统 CMS 输出的语义化 HTML」优化的正文抽取器。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










