PHP不原生支持RTF脚注解析,需用计数法提取{\footnote...}嵌套内容,或借助rtfphp库获取结构化脚注数组。

PHP 本身不原生支持 RTF 文件解析,尤其脚注(footnote)这类结构化内容需手动解析 RTF 控制字。RTF 是带标记的文本格式,脚注通常由 \footnote 或 \ftnalt 等控制序列包裹,且可能嵌套在段落、字体或样式块中。直接用 file_get_contents 读取后,需正则+状态机方式提取,不能靠简单字符串匹配。
识别 RTF 脚注的基本结构
标准 RTF 中脚注常见形式如下:
{\footnote\pard\plain\f0\fs20 这是脚注文字。}{\ftnalt\pard\plain\f0\fs20 另一种脚注格式}- 脚注编号常由
\fntext或外部\chftn引用,但内容主体在\footnote{...}内部 - 注意大括号嵌套:RTF 使用花括号成对表示组(group),脚注内容本身可能含嵌套括号(如字体、颜色等),需正确配对解析
用正则 + 括号计数法提取脚注内容
避免被中间括号打断,推荐用“计数法”逐字符扫描,而非单纯 preg_match_all。示例核心逻辑:
- 用
file_get_contents读取 RTF 文件为字符串(确保编码为 ANSI 或 UTF-16LE,RTF 常含 \ansicpg936 或 \uc1,需先检测并转 UTF-8) - 搜索
\footnote或\ftnalt开头位置,然后从该位置开始统计{和}数量 - 当左括号数 = 右括号数(且 ≥1)时,截取完整脚注组
- 对每个完整组,用
strip_tags(rtf2text($group))类方法清理控制字(或用轻量 RTF 解析器如 rtfphp 提取纯文本)
借助第三方库简化处理(推荐)
手动解析易出错,建议使用成熟小工具:
立即学习“PHP免费学习笔记(深入)”;
-
rtfphp:专为 PHP 设计的 RTF 解析器,支持提取脚注、尾注、标题等结构。安装:
composer require nuovo/rtfphp - 用法示例:
$rtf = new \RtfPhp\Document(file_get_contents('doc.rtf')); $footnotes = $rtf->getFootnotes(); // 返回数组,每项含 text、id、index 等 foreach ($footnotes as $fn) { echo "脚注 {$fn['index']}: {$fn['text']}\n"; } - 若需更高兼容性,可先用
unrtf(命令行工具)将 RTF 转为 HTML 或 plain text,再用 PHP DOM 或正则提取脚注区域
注意事项与常见坑
RTF 格式松散,不同编辑器导出差异大:
- Word 导出的 RTF 可能含 Unicode 转义(如
\u819c?),需调用mb_convert_encoding或专用解码函数还原中文 - 脚注编号未必连续,有些 RTF 把编号放在外部(如
\chftn),内容里无数字,需关联解析 - 部分 RTF 使用 \*\ 特殊组(如
{\*\footnote...)表示私有扩展,需兼容识别 - 不要依赖文件扩展名,先用
file -i或检查前几个字节({\rtf1)确认是否真为 RTF











