PHP不原生支持RTF样式解析,需借助rtf-parser等库提取加粗、字号、颜色等信息,并可转换为HTML;手动解析复杂且易错,仅适用于简单RTF。

PHP 本身不原生支持 RTF 文件的样式解析,RTF 是一种带控制字(如 \b、\i、\fs24、\cf1)和分组结构({...})的富文本格式。直接用 file_get_contents() 只能读到原始字符串,无法提取字体、颜色、加粗等样式信息。要真正“读取样式”,需解析 RTF 控制指令。
理解 RTF 基本结构是前提
RTF 文件以 {\rtf1 开头,内部嵌套多层花括号,每层可定义局部样式。关键控制字包括:
-
\b:加粗;\i:斜体;\ul:下划线 -
\fs24:字体大小(单位为半磅,即 24 = 12pt) -
\f0:选择字体编号(需查\fonttbl表) -
\cf1/\cb2:前景色/背景色(需查\colortbl) -
\pard、\ql、\qc:段落对齐
推荐方案:使用成熟解析库(如 rtf-parser)
手动解析 RTF 极易出错(嵌套、转义、编码、特殊字符等)。建议优先使用社区维护的解析器:
- GitHub 上较活跃的是 eymengt/rtf-parser(纯 PHP,轻量,支持基础样式提取)
- 安装:
composer require eymengt/rtf-parser - 基本用法示例:
use Eymengt\Rtf\RtfParser;
$rtf = file_get_contents('example.rtf');
$parser = new RtfParser();
$document = $parser->parse($rtf);
// 获取所有段落及样式信息
foreach ($document->getParagraphs() as $para) {
echo "文本: " . $para->getText() . "\n";
echo "加粗: " . ($para->isBold() ? '是' : '否') . "\n";
echo "字号: " . $para->getFontSize() . "\n"; // 如返回 24 → 12pt
echo "颜色索引: " . $para->getColorIndex() . "\n";
}
若需深度定制:手写简易解析器要点
仅适用于结构简单、样式有限的 RTF(如自生成报告),不推荐处理 Word 导出的复杂 RTF:
立即学习“PHP免费学习笔记(深入)”;
- 用正则或状态机逐字符/逐词扫描,跟踪
{/}深度 - 遇到反斜杠
\后读取控制字(如\b、\fs24),注意数字参数提取 - 跳过注释(
\*开头的控制字组,如{\*\generator ...}) - 识别
\fonttbl和\colortbl并缓存映射表(如f0 → "Times New Roman",cf1 → "#000000") - 文本内容在控制字之外、且不在花括号内(需排除指令区)
转换为 HTML 或 Markdown 便于后续处理
解析出样式后,常需输出为网页可用格式:
- 将
\b{...}转为... - 将
\fs24\f0\cf1组合转为 - 注意字符编码:RTF 常含
\'xx十六进制转义(如\'e9→ é),需用pack('H*', 'e9')解码











