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

PHP 讀取文字檔並實現分頁顯示完整教學

     編輯:PHP 相關知識

前言

在 Web 開發中,經常需要讀取大型文字檔(如日誌、小說、資料匯出)並分頁呈現給使用者。本文將示範如何使用 PHP 讀取 TXT 檔案,搭配自訂的中文截取函式,實現按字元數分頁顯示,並附上完整的分頁導航邏輯。

核心程式碼解析

1. 參數初始化與分頁邏輯

<?php
session_start();
// 預設第 1 頁
if (empty($page)) { $page = 1; }
// 從 GET 取得頁碼
if (isset($_GET['page'])) { $page = (int)$_GET['page']; }
?>

程式一開始啟動 Session,並處理頁碼參數。若無 page 參數則預設為第 1 頁,確保分頁邏輯穩健。

2. 讀取檔案並計算總頁數

<?php
if ($page) {
    // 一次性讀取整個檔案到字串
    $content = file_get_contents('example.txt');
    $length = strlen($content);
    // 每頁顯示 5000 個位元組(可依需求調整)
    $page_count = ceil($length / 5000);
}
?>

使用 file_get_contents() 將檔案完整讀入記憶體,再依每頁 5000 位元組計算總頁數。注意:若檔案極大(超過百 MB),建議改用 fseek() + fread() 逐塊讀取,避免記憶體耗盡。

3. 中文安全截取函式 msubstr()

function msubstr($str, $start, $len) {
    $strlength = $start + $len;
    $tmpstr = '';
    for ($i = 0; $i < $strlength; $i++) {
        // 換行符轉 <br />
        if (ord(substr($str, $i, 1)) == 0x0a) {
            $tmpstr .= '<br />';
        }
        // 判斷是否為中文字元(雙位元組)
        if (ord(substr($str, $i, 1)) > 0xa0) {
            $tmpstr .= substr($str, $i, 2);
            $i++; // 跳過第二個位元組
        } else {
            $tmpstr .= substr($str, $i, 1);
        }
    }
    return $tmpstr;
}

此函式逐位元組掃描字串,遇到換行符(0x0a)轉為 HTML 換行;偵測到高位元組(> 0xA0)視為中文雙位元組字元,一次取兩個位元組,避免中文被截斷成亂碼。

4. 截取當頁內容並輸出

<?php
// 計算前 (page-1) 頁的字元長度
$prev = msubstr($content, 0, ($page - 1) * 5000);
// 計算前 page 頁的字元長度
$curr = msubstr($content, 0, $page * 5000);
// 取差集即為當頁內容
echo substr($curr, strlen($prev), strlen($curr) - strlen($prev));
?>

透過兩次呼叫 msubstr() 取得「前 N-1 頁」與「前 N 頁」的已處理字串,再用 substr() 取差集,精準擷取當頁應顯示的內容。

5. 分頁導航列

<table width="100%" bgcolor="#cccccc">
<tr>
  <td width="42%" align="center"><span class="STYLE1">
    <?php echo $page; ?> / <?php echo $page_count; ?> 頁
  </span></td>
  <td width="58%" align="left"><span class="STYLE1">
    <?php
    echo '<a href="m.php?page=1">首頁</a> ';
    if ($page != 1) echo '<a href="m.php?page='.($page-1).'">上一頁</a> ';
    if ($page < $page_count) echo '<a href="m.php?page='.($page+1).'">下一頁</a> ';
    echo '<a href="m.php?page='.$page_count.'">尾頁</a>';
    ?>
  </span></td>
</tr>
</table>

簡單的四連結導航:首頁、上一頁、下一頁、尾頁,並顯示「目前頁 / 總頁數」。實際專案可擴充為數字分頁或 AJAX 無限捲軸。

完整範例檔案結構

  • m.php:主程式(含上述所有邏輯)
  • example.txt:欲顯示的文字檔(請自行準備,編碼建議 UTF-8)

進階優化建議

  1. 大檔案支援:改用 fopen()、fseek()、fread() 只讀取當頁所需區塊,降低記憶體佔用。
  2. 編碼統一:確保 TXT 檔、PHP 檔、HTML 輸出皆為 UTF-8,避免中文亂碼。
  3. 快取機制:對熱門內容引入檔案快取或 Redis,減少重複 I/O。
  4. 安全性:過濾 page 參數,防止路徑遍歷或 SQL 注入(本範例無資料庫操作,但仍建議 (int)$_GET['page'])。

總結

本文示範了「全文讀入 → 中文安全截取 → 差集擷取 → 分頁導航」的經典 PHP 分頁流程。雖程式碼精簡,卻涵蓋了中文編碼處理、分頁數學邏輯、前端導航等關鍵技術點,適合作為中小型文字檔瀏覽功能的起手式。若專案涉及大檔案或高併發,請參考進階建議進行架構升級。

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