直接 new parsedown() 出错是因为类未自动加载,需先运行 composer require erusev/parsedown 并在入口文件中引入 vendor/autoload.php;parsedown 默认不支持表格、脚注等扩展语法,须改用 league/commonmark;为防 xss,必须手动调用 setsafemode(true) 或结合 htmlpurifier 过滤;中文链接乱码源于 rawurlencode() 编码,应预处理路径或解析后 urldecode()。

为什么直接 new Parsedown() 会出错?
因为 Parsedown 类默认不自动加载,Composer 没装或没引入 autoloader 时,new Parsedown() 会报 Class 'Parsedown' not found。它不是 PHP 内置类,也不是通过 require 单文件就能跑起来的——哪怕你下载了 Parsedown.php,也得确保命名空间和类定义匹配。
正确做法是用 Composer 管理依赖:
- 运行
composer require erusev/parsedown(注意不是parsedown/parsedown,官方包名是erusev/parsedown) - 在入口文件(如
index.php)顶部加require 'vendor/autoload.php'; - 之后才能安全使用
$parsedown = new Parsedown();
如何让 Parsedown 支持表格、脚注等扩展语法?
Parsedown 默认只实现 CommonMark 子集,表格、脚注、任务列表等属于扩展功能,需手动开启对应方法。这些不是开关配置项,而是调用特定 setter:
- 启用表格:
$parsedown->setBreaksEnabled(true)(注意:这个方法实际影响换行,表格支持靠的是setTableEnabled(true)—— 但原生Parsedown并不提供该方法) - 真相是:标准
erusev/parsedown不支持表格,必须换用ParsedownExtra(已废弃)或改用league/commonmark - 如果坚持用
Parsedown,表格只能靠自定义解析器 + 正则预处理,或接受它不渲染|---|这类语法
简单说:别指望 Parsedown 开箱支持 GitHub Flavored Markdown 全特性;表格、围栏代码块语言标识(```php)能识别,但渲染成带 class 的 <code> 需自己 hook blockCode 方法。
怎样防止用户输入的 HTML 被执行?
Parsedown 默认**不转义 HTML**,它把 <script>alert(1)</script> 当作原始 HTML 渲染——这是设计使然,也是最大安全隐患点。
- 必须手动开启 HTML 过滤:
$parsedown->setSafeMode(true),这会让所有原始 HTML 标签被转义为文本 - 但
setSafeMode(true)同时禁用所有内联 HTML,比如<span class="hl">高亮</span>也会失效 - 更灵活的做法是:先用
Parsedown解析,再用HTMLPurifier或strip_tags()+ 白名单过滤,例如只允许<strong></strong>、<em></em>、@#@#@#@#@#@#@#@#@#@0→ 实际生成@#@#@#@#@#@#@#@#@#@1。- 解决方法是重写
inlineUrl方法,或在解析后用urldecode()处理输出的 HTML 字符串(仅限 href 属性) - 更稳妥的是:前端提交前就把中文路径转为拼音或短 ID,避免依赖解析器处理编码
- 注意
rawurlencode()和urlencode()行为差异,Parsedown用的是前者,空格变%20而非+
真正麻烦的不是乱码本身,而是你得判断这个 URL 是用户手写的、还是编辑器自动生成的——后者往往已经 encode 过一次,再被
Parsedownencode 就双重编码了。 - 解决方法是重写
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











