首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 移除字串換行符三大技巧:str_replace、preg_replace、PHP_EOL 常數

     編輯:PHP 相關知識

前言

處理使用者輸入、檔案讀取、API 回應時,常需移除換行符(\n、\r、\r\n)。本文比較三種常見做法的效能、適用場景與跨平台相容性,並給出最佳實務建議。

一、換行符基礎知識

符號名稱ASCII主要作業系統
\n (LF)Line Feed10Linux、Unix、macOS (現代)
\r (CR)Carriage Return13Classic Mac OS (OS 9 及之前)
\r\n (CRLF)Carriage Return + Line Feed13, 10Windows、DOS、網路協定 (HTTP、SMTP)

PHP 雙引號字串與 Heredoc 會解析 \n \r \t,單引號則不會。

二、三種移除方法比較

方法 1: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); // 合併多餘空行

方法 2: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。

方法 3: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 單一符號最快但需注意來源平台一致性。

四、最佳實務建議

  1. 已知來源平台: 直接 str_replace(PHP_EOL, '', $str)。
  2. 混合來源/未知平台: str_replace(["\r\n", "\r", "\n"], '', $str) 最稳健。
  3. 需保留段落結構: 先統一為 \n,再 preg_replace('/\n{2,}/', "\n\n", $str)。
  4. CSV/TSV 欄位清洗: str_replace(["\r\n", "\r", "\n"], ' ', $field) 避免欄位斷行破壞格式。
  5. 資料庫存儲前: 統一正規化為 \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。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved