PHP preg_replace()替换多换行符问题:结果为字符串\n而非换行
解决preg_replace替换换行符得到字面量"\n"的问题
哦这个坑我踩过!你现在遇到的问题核心是PHP中单引号与双引号的字符串解析规则差异:
- 单引号包裹的字符串是「纯字面量」,里面的
\n不会被解析为实际的换行符,只会被当成普通的两个字符(\+n)输出; - 双引号包裹的字符串才会解析转义字符,
\n在这里会被转换成真正的换行符。
修正方案1:改用双引号包裹替换字符串
直接把替换目标的单引号改成双引号就行,这是最直接的解决办法:
$entry = preg_replace('/\n{2,}/', "\n", $entry);
修正方案2:使用PHP_EOL适配不同系统
如果你的代码需要跨操作系统运行(比如同时在Linux和Windows环境),推荐用PHP内置的PHP_EOL常量,它会自动根据当前系统输出对应的换行符(Linux是\n,Windows是\r\n):
$entry = preg_replace('/\n{2,}/', PHP_EOL, $entry);
额外优化:兼容Windows风格换行
如果你的文本里可能混合了Windows风格的\r\n和Unix风格的\n换行,建议把正则表达式调整为匹配所有类型的连续换行:
$entry = preg_replace('/(\r?\n){2,}/', "\n", $entry);
这样不管是哪种换行格式的连续重复,都能被替换成单个换行符。
内容的提问来源于stack exchange,提问作者kai
相关产品推荐
相关产品推荐

