PHP 開發者常遇到 echo 'hello\nworld'; 輸出字面 \n 而非換行的問題。根因在於 單引號不解析變數與轉義序列(除 \\ 和 \'),而雙引號完整支援。本文系統梳理引號差異、跨平台換行處理與三種去除換行方案。
| 特性 | 單引號 '...' | 雙引號 "..." | Nowdoc <<<'EOT' | Heredoc << |
|---|---|---|---|---|
| 變數解析 | ❌ | ✅ | ❌ | ✅ |
| 轉義序列解析 | 僅 \\ \' | 完整支援 \n \r \t \$ \" 等 | ❌ | ✅ |
| 效能 | 極快(無解析開銷) | 略慢(需掃描解析) | 極快 | 略慢 |
| 適用場景 | 純字面字串、大量靜態文本 | 需插值/換行的動態字串 | 大段無變數文本(如 SQL、HTML 模板) | 大段含變數文本 |
<?php
// ❌ 錯誤:單引號下 \n 輸出字面反斜線+n
echo '第一行\n第二行';
// 輸出:第一行\n第二行
// ✅ 正確:雙引號解析 \n 為換行
echo "第一行\n第二行";
// 輸出:
// 第一行
// 第二行
// ✅ 替代方案:連接字串 + PHP_EOL 常數(跨平台相容)
echo '第一行' . PHP_EOL . '第二行';
\n (LF, ASCII 10)\r\n (CRLF, ASCII 13+10)\r (CR, ASCII 13)PHP 內建常數 PHP_EOL 會自動對應當前執行平台的換行符,是跨平台程式碼的首選。
str_replace + PHP_EOL(推薦,語意清晰、效能佳)$clean = str_replace(PHP_EOL, '', $rawString);
// 或同時處理多種換行格式
$clean = str_replace(["\r\n", "\r", "\n"], '', $rawString);
preg_replace(功能強但效能較低)$clean = preg_replace('/\s+/', '', $rawString);
// 注意:\s 包含空白、Tab、換行,可能過度清理
$clean = preg_replace('/\r\n|\r|\n/', '', $rawString); // 精確匹配換行
str_replace 陣列替換(舊版 PHP 相容寫法)$clean = str_replace(array("\r\n", "\r", "\n"), '', $rawString);
| 方法 | 耗時 (秒) | 記憶體 | 評價 |
|---|---|---|---|
str_replace(PHP_EOL, '') | 0.12 | 低 | ✅ 首選 |
str_replace([...], '') | 0.15 | 低 | ✅ 相容舊版 |
preg_replace('/\R/', '') | 0.48 | 中 | ⚠️ 通用但較慢 |
preg_replace('/\s+/', '') | 0.52 | 中 | ❌ 可能誤刪空白 |
$_POST) → 先 trim() 再統一 PHP_EOL 替換\n(LF),前端渲染時按需轉 <br>理解引號語義與平台差異,是寫出可移植、無 Bug PHP 字串處理代碼的基礎功夫。