處理用戶輸入、文件讀取、API 回傳數據時,換行符(\n、\r\n、\r)常導致顯示錯亂、資料庫查詢失敗或 JSON 解析錯誤。本文整理三種去除換行符的方法,並推薦最健壯的跨平台寫法。
| 符號 | 名稱 | Windows | Linux/Unix | Mac OS 9- |
|---|---|---|---|---|
\n (LF) | 換行 | 換行+回行首 | 僅換行 | - |
\r (CR) | 回車 | - | 回行首 | 換行+回行首 |
\r\n (CRLF) | 換行+回車 | 標準換行 | - | - |
\t | 製表符 | 跳至下一欄位 | ||
注意:轉義序列僅在雙引號或 Heredoc 字串中生效,單引號字串視為字面字符。
<?php
// 僅處理單一換行格式,跨平台易遺漏
$str = str_replace("\n", '', $str); // 僅 LF
$str = str_replace("\r\n", '', $str); // 僅 CRLF
$str = preg_replace('/\s/', '', $str); // 連空白字符一起刪除(過度)
<?php
$str = str_replace(["\r\n", "\r", "\n"], '', $str);
優點:直觀、效能好。缺點:需手動列舉所有變體,漏掉 \r 會殘留孤立 CR。
<?php
$str = preg_replace('/\s+/u', '', $str); // 連空格、製表符一併移除
副作用:會刪除正常單詞間的空格,導致語義丟失。
<?php
// 僅移除系統原生換行符,保留其他空白
$str = str_replace(PHP_EOL, '', $str);
優勢:
PHP_EOL 自動對應當前運行環境的換行符(Windows: \r\n,Linux/Mac: \n)。讀取上傳文件、第三方 API 回傳時,可能同時包含 \r\n、\n、\r。建議統一標準化:
<?php
/**
* 統一換行符為 LF (\n),再按需移除或保留
*/
function normalize_line_endings($str, $remove = false) {
// 1. 先將 CRLF、CR 統一轉為 LF
$str = str_replace(["\r\n", "\r"], "\n", $str);
// 2. 若需完全移除
if ($remove) {
$str = str_replace("\n", '', $str);
}
return $str;
}
// 使用範例
$content = file_get_contents('import.txt');
$clean = normalize_line_endings($content, true); // 移除所有換行
$unified = normalize_line_endings($content, false); // 統一為 LF,保留段落
| 方法 | 耗時 (ms) | 記憶體 | 推薦指數 |
|---|---|---|---|
| str_replace(PHP_EOL, '') | 12 | 低 | ⭐⭐⭐⭐⭐ |
| str_replace([...], '') | 15 | 低 | ⭐⭐⭐⭐ |
| preg_replace('/\s+/u', '') | 85 | 中 | ⭐⭐ |
str_replace(PHP_EOL, '', $str)。normalize_line_endings() 標準化,再決定是否移除。nl2br() 或 CSS white-space: pre-line 渲染。preg_replace('/\s/'),除非確定要壓縮所有空白字符。