php多行文件处理需统一换行符、正确编码转换、流式处理大文件、保留权限与bom:先用str_replace归一为\n,正则跨行匹配加s修饰符,大文件用分块读取,编码用mb_detect_encoding识别并转换,写回时chmod保持权限,读前3字节检测bom。

PHP读取文件时遇到换行符不一致怎么办
Windows用\r\n,Linux/macOS用\n,直接用str_replace替换多行字符串大概率失败——因为目标文本里可能是"abc\r\n123",而你写的替换模板却是"abc\n123"。
正确做法是统一规范化换行符再操作:
- 用
file_get_contents读取后,先用str_replace(["\r\n", "\r"], "\n", $content)归一化 - 替换目标也按
\n写,比如"header\nversion: 1.0\nfooter" - 写回文件前,按目标系统选换行符:
PHP_OS_FAMILY === 'Windows' ? str_replace("\n", "\r\n", $new) : $new
用preg_replace安全匹配跨行内容
str_replace无法处理“开头固定、中间任意、结尾固定”的多行块(比如注释块、配置段),必须用正则,但默认.不匹配换行符。
关键参数是s修饰符(PCRE_DOTALL):
立即学习“PHP免费学习笔记(深入)”;
$pattern = '/<!-- START BLOCK -->(.*?)<!-- END BLOCK -->/s'; $content = preg_replace($pattern, $replacement, $content);
注意点:
- 务必加
s,否则.*?跨不过\n - 用
.*?而非.*,避免贪婪匹配到最远的结束标记 - 如果内容含
/,改用其他分隔符,比如#











