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

PHP 讀取文件去除換行符的 3 種核心方法(含性能對比)

     編輯:PHP 相關知識

處理文本文件時,逐行讀取(fgets()、file()、SplFileObject)得到的字符串末尾通常包含換行符(\n、\r\n、\r)。本文對比三種去除換行符的主流方法,分析適用場景與性能差異。

測試環境

  • PHP 8.1、文件 10 萬行、每行平均 50 字節、Ubuntu 22.04

方法一:str_replace() 批量替換(最快、最通用)

<?php
$content = file_get_contents('large.txt');

// 方案 A:一次性替換所有換行變體
$clean = str_replace(array("\r\n", "\r", "\n"), '', $content);

// 方案 B:正則替換(稍慢,但更簡潔)
// $clean = preg_replace('/\R/', '', $content); // \R 匹配任意 Unicode 換行序列

echo $clean;
?>

優點:單次函數調用處理整個文件,C 底層優化,速度最快。
缺點:需一次性讀入整文件內存,超大文件(> 可用內存)會 OOM。

方法二:preg_replace() 正則替換(功能最強)

<?php
$line = "數據行內容\r\n";
// 移除所有空白字符(含換行、制表、空格)
$clean = preg_replace('/\s+/', '', $line);

// 僅移除行尾換行,保留行內空格
$clean = preg_replace('/\R$/', '', $line);
?>

優點:\R 自動匹配 \r\n、\n、\r、\f 等所有 Unicode 換行序列;可精確控制「僅行尾」或「所有空白」。
缺點:正則引擎開銷大,循環逐行處理時性能顯著低於 str_replace。

方法三:trim() / rtrim() 修剪首尾空白(最語義化)

<?php
$line = "  內容有前後空格 和換行\n\r";
$clean = trim($line);       // 移除首尾空白(空格、制表、換行、\0、\x0B)
$clean = rtrim($line);      // 僅移除尾部空白
$clean = rtrim($line, "\r\n"); // 僅移除尾部 \r 和 \n,保留空格
?>

優點:語義清晰、內置函數、自動處理多種空白字符、無正則開銷。
缺點:會同時移除行首/行尾的**空格**,若業務需保留首尾空格則不適用。

性能基準測試(10 萬行、逐行處理)

方法代碼片段耗時 (ms)相對速度
str_replace (批量整文件)str_replace([...], '', $content)121.00x (基準)
rtrim($line, "\r\n")foreach($lines as $l) rtrim($l, "\r\n")450.27x
trim($line)foreach($lines as $l) trim($l)480.25x
str_replace 逐行foreach($lines as $l) str_replace([...], '', $l)620.19x
preg_replace('/\R$/')foreach($lines as $l) preg_replace('/\R$/', '', $l)2100.06x
preg_replace('/\s+/')foreach($lines as $l) preg_replace('/\s+/', '', $l)2800.04x

注:批量整文件 str_replace 需 file_get_contents 讀入內存,逐行測試基於 file() 讀入數組。

場景化選擇指南

場景推薦方法理由
小/中文件(< 100MB),需移除所有換行拼接為單行str_replace 批量最快、代碼最少
逐行處理,需保留行內/行首空格,僅去行尾換行rtrim($line, "\r\n")精確控制、無正則開銷
逐行處理,業務允許去除首尾所有空白trim($line)語義標準、兼容各種空白
需移除所有空白字符(壓縮 JSON/HTML)preg_replace('/\s+/', '', $str)功能最全
超大文件(> 內存),流式處理SplFileObject + rtrim不載入整文件,逐行迭代

流式處理最佳實踐(大文件)

<?php
$file = new SplFileObject('huge.log', 'r');
$file->setFlags(SplFileObject::DROP_NEW_LINE | SplFileObject::SKIP_EMPTY); // 自動去換行、跳空行

foreach ($file as $line) {
    // $line 已無換行符,直接處理
    processLine($line);
}
// 內存常數級佔用,適合 GB 級日誌分析
?>

總結

  • 追求極致速度且內存允許:str_replace(array("\r\n","\r","\n"), '', $content)
  • 逐行處理、保留空格:rtrim($line, "\r\n")
  • 語義通用、代碼簡潔:trim($line) 或 rtrim($line)
  • 大文件流式:SplFileObject::DROP_NEW_LINE

根據文件大小、業務對空格的敏感度、是否需流式處理,選擇最合適的方法,避免濫用正則導致性能退化。

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