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

PHP 讀取文字檔換行符問題完整解析:\r\n 處理與去除技巧

     編輯:PHP 相關知識

問題現象

在 Windows 環境下,文字檔換行符為 `\r\n`(十六進位 `0x0D 0x0A`)。使用 `fgets()` 逐行讀取時,每行字串尾端會包含這兩個字元,導致 `strlen("123")` 回傳 5 而非 3,進而影響後續比對、切割、資料庫寫入等邏輯。

實測驗證

<?php
$file = 't1.txt';
$fp = fopen($file, 'w');
fwrite($fp, "123\r\n123\r\n"); // 寫入兩行
fclose($fp);

$fp = fopen($file, 'r');
while (!feof($fp)) {
    $line = fgets($fp);
    echo "長度: " . strlen($line) . " | 內容: [" . $line . "]
"; } fclose($fp); /* 輸出: 長度: 5 | 內容: [123 ] 長度: 5 | 內容: [123 ] 長度: 0 | 內容: [] */

三種去除換行符的方法

1. `rtrim()` —— 最推薦(自動處理 \r \n \t 空白)

$line = rtrim($line, "\r\n"); // 僅移除行尾換行符,保留前導空白

2. `str_replace()` —— 明確替換

$line = str_replace(["\r\n", "\r", "\n"], '', $line); // 移除所有換行符

3. `substr()` 舊式寫法(不推薦,易出錯)

$len = strlen($line);
if ($len >= 2 && substr($line, -2) === "\r\n") {
    $line = substr($line, 0, -2);
} elseif ($len >= 1 && in_array(substr($line, -1), ["\n", "\r"])) {
    $line = substr($line, 0, -1);
}

最佳實務:統一使用 `rtrim()`

<?php
function read_lines_clean(string $path): array
{
    $lines = [];
    $fp = fopen($path, 'r');
    if ($fp) {
        while (($line = fgets($fp)) !== false) {
            $lines[] = rtrim($line, "\r\n");
        }
        fclose($fp);
    }
    return $lines;
}

// 使用
$data = read_lines_clean('t1.txt');
// $data = ['123', '123'];

補充:跨平台換行符常數 `PHP_EOL`

  • 寫入時:`fwrite($fp, "資料" . PHP_EOL);` —— 自動依伺服器 OS 產生正確換行符。
  • 讀取時:`rtrim($line, "\r\n")` 可同時相容 Windows (`\r\n`)、Linux (`\n`)、舊 Mac (`\r`)。

原文摘自 zuodefeng 筆記

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