PHP无法原生解析RTF,需通过正则剥离控制字、剔除字体/颜色表等冗余区块,并处理换行与十六进制字符;生产环境推荐pandoc、php-rtf库或COM调用Word。

PHP 本身不原生支持解析 RTF 文件,更不会自动过滤样式;但可以通过文本处理方式剥离 RTF 控制字(如 \b、\i、\fs24、{\fonttbl...} 等),提取纯文本内容。关键不是“读取”,而是“解码 + 清洗”。
用正则初步剥离 RTF 控制指令
RTF 文件以 {\rtf1 开头,内部大量使用反斜杠 \ 引导的控制字和分组花括号 { }。可先用简单正则移除常见格式指令:
- 去掉所有反斜杠开头的单词及可选参数(如 \b0、\par、\tab): preg_replace('/\\\\[a-zA-Z]+[0-9]*\s?/', '', $rtf)
- 去掉花括号(但需注意嵌套,简单场景可用两轮清除):str_replace(['{', '}'], '', $rtf)
- 清理多余空格与换行:preg_replace('/\s+/', ' ', $rtf)
跳过字体表、颜色表等冗余区块
RTF 头部常含 {\fonttbl...}、{\colortbl...}、{\stylesheet...} 等大段定义内容,它们不含实际正文,应优先剔除:
- 用 preg_replace('/\{\\\\fonttbl[^}]*\}/', '', $rtf) 移除字体表
- 同理处理颜色表:preg_replace('/\{\\\\colortbl[^}]*\}/', '', $rtf)
- 匹配并删除整个样式区块(注意非贪婪):preg_replace('/\{\\\\stylesheet[^}]*\}/', '', $rtf)
保留基础结构换行与段落
完全去样式后可能丢失可读性。建议保留语义性控制符,提升结果可读:
立即学习“PHP免费学习笔记(深入)”;
- 将 \par 替换为 \n\n 表示段落分隔
- 把 \line 或 \lbr 换成单换行 \n
- 遇到 \'xx(十六进制字符,如 \'e9 表示 é),需用 hex2bin() 转义还原(先提取 xx,再 chr(hexdec($xx)))
更稳方案:调用外部工具或专用库
纯正则易漏边缘情况(如嵌套花括号、引号转义、Unicode 支持弱)。生产环境推荐:











