處理使用者輸入、檔案讀取、API 回應時,常需移除換行符(\n、\r、\r\n)。本文比較三種常見做法的效能、適用場景與跨平台相容性,並給出最佳實務建議。
| 符號 | 名稱 | ASCII | 主要作業系統 |
|---|---|---|---|
\n (LF) | Line Feed | 10 | Linux、Unix、macOS (現代) |
\r (CR) | Carriage Return | 13 | Classic Mac OS (OS 9 及之前) |
\r\n (CRLF) | Carriage Return + Line Feed | 13, 10 | Windows、DOS、網路協定 (HTTP、SMTP) |
PHP 雙引號字串與 Heredoc 會解析 \n \r \t,單引號則不會。
str_replace 陣列替換(推薦:速度最快、語意明確)$str = "Line 1\r\nLine 2\nLine 3\rLine 4";
// 一次替換所有變體
$clean = str_replace(["\r\n", "\r", "\n"], '', $str);
// 結果:Line 1Line 2Line 3Line 4
// 保留段落結構(雙換行轉單一標記)
$clean = str_replace(["\r\n", "\r", "\n"], "\n", $str);
$clean = preg_replace('/\n{2,}/', "\n\n", $clean); // 合併多餘空行
preg_replace 正則替換(功能強大、效能稍慢)$str = "Line 1\r\nLine 2\nLine 3\rLine 4";
// \R 匹配任意 Unicode 換行序列(PHP 5.2.4+)
$clean = preg_replace('/\R/u', '', $str); // 移除所有換行
$clean = preg_replace('/\R/u', ' ', $str); // 換行轉空白
$clean = preg_replace('/\s+/u', ' ', $str); // 所有空白字元(含 tab)合併為單一空白
效能: 正則引擎啟動開銷較大,短字串差異微乎其微,百萬級處理建議用 str_replace。
PHP_EOL 常數(跨平台相容、語意最清晰)
// PHP_EOL 在執行環境自動解析為正確換行符
// Windows: \r\n | Linux/macOS: \n
$str = "Line 1" . PHP_EOL . "Line 2" . PHP_EOL . "Line 3";
// 移除當前平台換行符
$clean = str_replace(PHP_EOL, '', $str);
// 處理來自不同平台的文字(建議先統一再移除)
$normalized = str_replace(["\r\n", "\r"], "\n", $str); // 統一為 LF
$clean = str_replace("\n", '', $normalized);
$str = str_repeat("Line\r\n", 100000); // ~1.2MB
$t = microtime(true);
str_replace(["\r\n", "\r", "\n"], '', $str);
echo "str_replace: ", microtime(true) - $t, "s\n"; // ~0.008s
$t = microtime(true);
preg_replace('/\R/u', '', $str);
echo "preg_replace: ", microtime(true) - $t, "s\n"; // ~0.025s
$t = microtime(true);
str_replace(PHP_EOL, '', $str);
echo "PHP_EOL: ", microtime(true) - $t, "s\n"; // ~0.006s (僅單一平台符號)
結論:str_replace 陣列版最快且穩定,PHP_EOL 單一符號最快但需注意來源平台一致性。
str_replace(PHP_EOL, '', $str)。str_replace(["\r\n", "\r", "\n"], '', $str) 最稳健。\n,再 preg_replace('/\n{2,}/', "\n\n", $str)。str_replace(["\r\n", "\r", "\n"], ' ', $field) 避免欄位斷行破壞格式。\n (LF),查詢/顯示層再按前端需求轉換。trim 只能移除首尾$str = "\n Hello \r\n";
echo trim($str); // "Hello" (首尾空白含換行)
echo ltrim($str); // "Hello \r\n"
echo rtrim($str); // "\n Hello"
若需移除字串中間換行,必須用上述替換方法。
移除換行符首選 str_replace(["\r\n", "\r", "\n"], '', $str),兼顧速度與跨平台相容;已知單一平台來源可用 PHP_EOL;需複雜空白處理才動用 preg_replace。統一內部儲存格式為 LF,能避免大量跨平台相容 Bug。