PHP7.4处理RTF文件时preg_replace正则如何保留\par换行标记
RTF格式清理保留换行标记实现方案
原有正则会无差别匹配删除所有RTF控制字、花括号边界,直接修改正则匹配排除规则容易出现优先级冲突、误匹配问题,采用「临时占位-清理-还原」的三步法实现成本最低,且不会破坏原有正则已经验证过的清理效果。
可直接运行的代码
$strFileData = file_get_contents('testdata/test.rtf',true); // 提前将需要保留的换行标记替换为不会被正则匹配的特殊占位符 $strFileData = str_replace('} \par', '___RTF_NEWLINE_HOLD___', $strFileData); // 沿用原有正则逻辑清理所有RTF格式编码 $strCleanedFile = preg_replace("/{\*?\\\\.+(;})|\s?\\\[A-Za-z0-9]+|\s?{\s?\\\[A-Za-z0-9‹]+\s?|\s?}\s?/", '', $strFileData); // 清理完成后将占位符还原为需要保留的换行标记,如需实际文本换行可直接替换为PHP_EOL或"\n" $strCleanedFile = str_replace('___RTF_NEWLINE_HOLD___', "} \par", $strCleanedFile);
效果验证
针对给出的示例原始行:
{\loch\cf17\fs13\dbch\af7\loch MARTHA SAYERS 003145840 909090KU1 OTH 04/09/22 3 COMM $1895.70 $189.57 $0.00 $0.00 $189.57 USD $189.57} \par \pard\plain \s21\rtlch\af9\afs24
处理后输出为:
MARTHA SAYERS 003145840 909090KU1 OTH 04/09/22 3 COMM $1895.70 $189.57 $0.00 $0.00 $189.57 USD $189.57} \par
既清理了所有无关格式控制字,也完整保留了需要的换行标识。
兼容性优化
如果RTF源文件中}和\par之间可能存在多个空格、制表符等空白字符,可以把第一步的固定字符串替换改成正则匹配,适配更多格式变体:
// 匹配}和\par之间任意长度空白的场景 $strFileData = preg_replace('/}\s+\\\\par\b/', '___RTF_NEWLINE_HOLD___', $strFileData);
内容的提问来源于stack exchange,提问作者Martha J Sayers
相关产品推荐
相关产品推荐

