在 Web 開發中,經常需要讀取大型文字檔(如日誌、小說、資料匯出)並分頁呈現給使用者。本文將示範如何使用 PHP 讀取 TXT 檔案,搭配自訂的中文截取函式,實現按字元數分頁顯示,並附上完整的分頁導航邏輯。
<?php
session_start();
// 預設第 1 頁
if (empty($page)) { $page = 1; }
// 從 GET 取得頁碼
if (isset($_GET['page'])) { $page = (int)$_GET['page']; }
?>
程式一開始啟動 Session,並處理頁碼參數。若無 page 參數則預設為第 1 頁,確保分頁邏輯穩健。
<?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() 逐塊讀取,避免記憶體耗盡。
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)視為中文雙位元組字元,一次取兩個位元組,避免中文被截斷成亂碼。
<?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() 取差集,精準擷取當頁應顯示的內容。
<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 無限捲軸。
fopen()、fseek()、fread() 只讀取當頁所需區塊,降低記憶體佔用。page 參數,防止路徑遍歷或 SQL 注入(本範例無資料庫操作,但仍建議 (int)$_GET['page'])。本文示範了「全文讀入 → 中文安全截取 → 差集擷取 → 分頁導航」的經典 PHP 分頁流程。雖程式碼精簡,卻涵蓋了中文編碼處理、分頁數學邏輯、前端導航等關鍵技術點,適合作為中小型文字檔瀏覽功能的起手式。若專案涉及大檔案或高併發,請參考進階建議進行架構升級。