tidy扩展需在编译php时用--with-tidy启用或手动编译加载,phpenv仅管理版本不安装扩展;默认安装不含tidy,否则调用tidy_parse_string()会报错。

phpenv 本身不负责安装 PHP 扩展,它只管理 PHP 版本;tidy 扩展必须在编译 PHP 时启用,或在已安装的 PHP 上单独编译加载。 直接用 phpenv install 装出来的 PHP 默认不含 tidy,除非你提前配置了编译参数 —— 否则运行 tidy_parse_string() 会报 Call to undefined function tidy_parse_string()。
编译安装 PHP 时启用 --with-tidy
这是最干净、兼容性最好的方式,尤其适合新装 PHP 版本:
- 确保系统已安装
libtidy-devel(CentOS/RHEL)或libtidy-dev(Ubuntu/Debian),否则./configure会失败并提示Cannot find libtidy - 修改
~/.phpenv/plugins/php-build/share/php-build/default_configure_options,在末尾追加--with-tidy(注意不要漏掉空格和换行) - 重新执行
phpenv install 8.3.13(以你要装的版本为准),构建过程会自动链接系统 tidy 库 - 装完后验证:
php -m | grep tidy应输出tidy;再跑php -r "var_dump(function_exists('tidy_parse_string'));"应返回bool(true)
给已安装的 PHP 补装 tidy(不推荐但可行)
如果你已用 phpenv install 装好某个 PHP 版本,又不想重装,可以手动编译扩展。但要注意:PHP 运行时 ABI 必须匹配,且需对应源码 —— phpenv 默认不保留源码,得自己找或重新下载:
- 进到对应 PHP 源码目录(如
~/.phpenv/versions/8.3.13/src),再进ext/tidy - 运行
/path/to/your/phpenv/versions/8.3.13/bin/phpize(务必用目标版本的phpize) - 执行
./configure --with-php-config=/path/to/your/phpenv/versions/8.3.13/bin/php-config --with-tidy -
make && make install后,会在ext/目录生成tidy.so - 编辑该 PHP 版本的
php.ini(路径通常为~/.phpenv/versions/8.3.13/etc/php.ini),加入extension=tidy - 重启终端或运行
phpenv rehash,再用php -m确认
用 tidy 扩展修复 HTML 格式不是“一键美化”,而是结构校验+基础重整
tidy 的核心能力是解析破损 HTML 并输出合法 DOM 结构,不是替代 Prettier 或 PHP-CS-Fixer 的代码美化工具。它对缩进、属性排序、换行风格等不做智能调整:
- 基础用法:
$tidy = tidy_parse_string($html, ['indent' => true, 'output-xhtml' => true, 'show-body-only' => true], 'utf8');—— 注意indent只控制是否缩进,不控制缩进宽度;show-body-only可剥离 head - 常见陷阱:如果输入含未闭合的
<div> 或嵌套错乱,<code>tidy会尝试修复,但结果可能与预期不同;建议先用tidy_repair_string()替代tidy_parse_string()简化流程 - 不处理 PHP 混排逻辑:像
<?php if ($x): ?><div> <?php endif; ?> 这类模板,<code>tidy会把 PHP 标签当纯文本处理,可能导致结构错乱 —— 此类场景更适合用php-cs-fixer配合 HTML 规则(如html_comment、no_mixed_echo_print)替代方案:PHP-CS-Fixer 处理 PHP+HTML 混排更稳妥
如果你的真实需求是“让 PHP 模板里的 HTML 更整齐”,而不是“修复严重破损的 HTML 字符串”,
php-cs-fixer是更贴切的选择:- 它能识别
<?php块和 HTML 标签边界,避免tidy把 PHP 代码当文本吞掉 - 支持
full_tag、blank_line_after_opening_tag等规则,对模板可读性提升明显 - 安装只需:
composer require --dev friendsofphp/php-cs-fixer,然后在项目根目录建.php-cs-fixer.php配置文件,启用'@PSR12' + ['html' => true]类规则 - 运行
vendor/bin/php-cs-fixer fix templates/ --dry-run --diff先预览效果,无误后再执行真实修复
真正容易被忽略的是:tidy 的修复行为高度依赖输入 HTML 的破损程度和配置项组合,同一段 HTML 在不同
tidy版本(libtidy 5.x vs 6.x)下输出可能不一致;而 PHP-CS-Fixer 的规则行为稳定、可预测,更适合纳入 CI 流程做格式守门人。 - 它能识别











