PHP 8.5.7 可直接使用 Parsedown 单文件版(v1.9+)完成 AI 生成 Markdown 到 HTML 转换,无需 Composer;需清洗非法控制字符、代码围栏及 BOM,并按场景决定是否启用 setBreaksEnabled(true)。

PHP 8.5.7 下直接用 Parsedown 就能完成 AI 生成 Markdown 到 HTML 的转换,无需额外扩展或兼容层——但前提是内容干净、不带非法控制字符,且你明确控制输入来源。
为什么不用 composer require erusev/parsedown?
因为 PHP 8.5.7 已默认启用 mbstring 和 json 扩展,而 Parsedown 单文件版(v1.9+)完全兼容该版本,无需 Composer 环境也能跑。很多项目部署在轻量服务器或容器里,没装 Composer 或权限受限,硬走 composer require 反而卡在 autoloader 配置上。
- 直接下载
Parsedown.php(官方 Gitee 或 GitHub release 页面最新版)扔进app/Utils/或vendor/目录下 - 用
require_once 'app/Utils/Parsedown.php';引入,不是include——避免重复加载报错 -
Parsedown不依赖ext-pcre回溯深度,对 AI 输出中常见的长链接、嵌套反引号、连续空行容忍度高
AI 输出的 Markdown 常见脏数据怎么清理?
大模型返回的 Markdown 经常夹带非打印字符(如 \u{200b} 零宽空格)、多余换行、开头的「```markdown」代码块标记,直接喂给 Parsedown::text() 会渲染出错或空白。
- 先用
preg_replace('/^\s*```(?:markdown)?\r?\n|\r?\n```?\s*$/u', '', $raw)去掉首尾代码围栏 - 用
mb_convert_encoding($raw, 'UTF-8', 'UTF-8')强制重编码,清除 BOM 和乱码字节 - 用
trim(preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/u', '', $raw))过滤 ASCII 控制字符 - 别跳过这步:AI 有时在列表前多加一个空行,
Parsedown会误判为段落分隔,建议统一preg_replace("/\n{3,}/", "\n\n", $cleaned)
Parsedown->setBreaksEnabled(true)->text() 要不要加?
要,但只在你确认输出目标是网页正文时才开。AI 生成内容多数用于后台文档预览或邮件模板,用户不希望换行全变成 <br>——它会让段落间距失控,尤其配合 Tailwind 或 Bootstrap 时。
立即学习“PHP免费学习笔记(深入)”;
-
setBreaksEnabled(true)把单个\n转成<br>,适合聊天记录、API 响应说明等「行内换行敏感」场景 - 普通文档(如 README、帮助页)保持默认
false,让Parsedown严格按 Markdown 规范:只有空行才分段 - 注意:
setBreaksEnabled()必须在text()前调用,链式写法失效概率低,但若中间有异常中断,状态可能残留——建议每次 new 一个新实例
真正容易被忽略的是:AI 输出可能含未闭合的内联 HTML 标签(比如「<span class="warning">注意」),Parsedown 默认不处理,也不会报错,结果就是整段 HTML 被当作文本原样输出。如果业务允许,加一层 strip_tags($html, ['br', 'strong', 'em', 'a', 'code']) 更稳妥。



















