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 替换为 nn 表示段落分隔
- 把 line 或 lbr 换成单换行 n
- 遇到 ‘xx(十六进制字符,如 ‘e9 表示 é),需用 hex2bin() 转义还原(先提取 xx,再 chr(hexdec($xx)))
更稳方案:调用外部工具或专用库
纯正则易漏边缘情况(如嵌套花括号、引号转义、Unicode 支持弱)。生产环境推荐: