应安装 erusev/parsedown 或 league/commonmark 等 PHP Markdown 解析库,而非搜索不存在的“composer markdown plugin”;解析需手动实例化类调用方法,注意换行处理与 XSS 防护。

composer install 时找不到 markdown 相关包
Composer 本身不内置 Markdown 解析能力,所谓“Markdown 插件”是误称——你实际需要的是一个 PHP 的 Markdown 解析库,比如 erusev/parsedown 或 league/commonmark。直接搜 “composer markdown plugin” 会走偏。
常见错误现象:composer require markdown 报错 Could not find package markdown;或装了名字带 markdown 但没文档、没函数的废弃包。
- 用
composer require erusev/parsedown(轻量,单文件,兼容 PHP 7.4+) - 或
composer require league/commonmark:^2.4(功能全,支持扩展语法、HTML 安全过滤) - 别碰
cebe/markdown(已归档,PHP 8.1+ 兼容性差) - 安装后不会自动“启用”,需在代码里手动实例化和调用
parsedown::text() 解析结果含多余换行或空格
Parsedown 默认行为是忠实转译,但 HTML 渲染时连续空白会被压缩,导致预览和实际页面表现不一致。这不是 bug,是设计使然。
使用场景:从数据库读取原始 MD 字符串,直接丢给 Parsedown::text() 输出,前端看到段落间多了一行空行。
- 检查原始字符串是否自带 \r\n 或多个 \n ——
Parsedown不做 trim,也不 normalize 换行符 - 解析前先处理:
$clean = preg_replace("/\r\n|\r/", "\n", trim($raw)); - 避免在 MD 源里写空行分隔标题与段落(它会生成
<p></p>),改用单个换行 -
league/commonmark对空白更宽容,但体积大、启动慢,小项目没必要
commonmark 渲染后 script 标签被过滤或执行
league/commonmark 默认禁用 HTML,但如果你开了 HtmlRenderer 又没配安全策略,用户提交的 <script>alert(1)</script> 可能被执行。
错误现象:后台显示正常,前端突然弹窗;或富文本编辑器插入的代码块被当成 HTML 渲染。
- 默认配置下,
<script>、<iframe>等标签会被静默删除,不是“不过滤”,而是“不解析为 HTML 节点” - 若需保留部分 HTML(如
<details>),得显式添加HtmlBlockExtension并配合HtmlRenderer的escape_html设为false - 但只要设了
escape_html => false,就必须自己做 XSS 过滤,推荐用league/html-to-markdown反向校验,或加DOMDocument白名单清洗 - 别依赖
strip_tags()—— 它不防<img onerror=...>
vendor/autoload.php 引入后 parseMarkdown() 找不到
这是新手最常卡住的点:包装好了,require 'vendor/autoload.php'; 也写了,但一调用就报 Call to undefined function parseMarkdown()。
原因很简单:PHP 没有全局 Markdown 函数。所有解析都必须通过类实例完成。
-
erusev/parsedown:要 newParsedown(),再调$parser->text($md) -
league/commonmark:要 newEnvironment::createCommonMarkEnvironment(),再用new HtmlRenderer(...)配合$document = $converter->convertToHtml($md) - 不存在
parseMarkdown()、md2html()这类函数 —— Composer 不提供函数式接口 - 如果用了 IDE,记得刷新索引,否则
Parsedown类可能标红,但运行没问题
真正麻烦的不是装哪个包,而是搞清「谁负责转义」「谁控制 HTML 输出」「原始换行怎么归一」——这三处不盯紧,线上就容易出渲染错位或 XSS 漏洞。










