php实现长文档分页
PHP实现长文档分页的方法
按固定字符数分页
通过mb_substr函数按固定长度切割字符串,确保中文字符不被截断。需要开启mbstring扩展。
function splitByChars($content, $charsPerPage = 2000) {
$pages = [];
$length = mb_strlen($content, 'UTF-8');
for ($i = 0; $i < $length; $i += $charsPerPage) {
$pages[] = mb_substr($content, $i, $charsPerPage, 'UTF-8');
}
return $pages;
}
按段落分页
通过检测换行符\n或段落标签<p>进行自然分段,适合保留文档原有结构。
function splitByParagraphs($content, $parasPerPage = 5) {
$paragraphs = preg_split('/\n|\<p\>/', $content);
$pages = array_chunk($paragraphs, $parasPerPage);
return array_map('implode', $pages);
}
按HTML标签分页
使用DOMDocument解析HTML文档,按标签层级分页。
function splitHtmlByTags($html, $tagsPerPage = 10) {
$dom = new DOMDocument();
@$dom->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'));
$xpath = new DOMXPath($dom);
$nodes = $xpath->query('//body/*');
$pages = [];
$currentPage = '';
$count = 0;
foreach ($nodes as $node) {
$currentPage .= $dom->saveHTML($node);
if (++$count % $tagsPerPage === 0) {
$pages[] = $currentPage;
$currentPage = '';
}
}
if ($currentPage !== '') $pages[] = $currentPage;
return $pages;
}
数据库分页方案
对于存储在数据库中的长文本,可用SQL的LIMIT分页。
function getPaginatedFromDB($docId, $page, $itemsPerPage = 10) {
$offset = ($page - 1) * $itemsPerPage;
$query = "SELECT SUBSTRING(content, $offset, $itemsPerPage)
FROM documents WHERE id = $docId";
// 执行查询并返回结果
}
前端协同分页
通过AJAX动态加载分页内容,减少服务器压力。
// 前端示例代码
function loadPage(pageNum) {
fetch(`get_page.php?page=${pageNum}`)
.then(response => response.text())
.then(html => {
document.getElementById('content').innerHTML = html;
});
}
性能优化建议
- 对静态文档可预生成分页缓存
- 使用
ob_start()缓冲输出大数据量 - 避免在循环中重复连接数据库
- 考虑使用Redis缓存分页结果
每种方法适用于不同场景:字符分页适合纯文本,段落分页保留阅读体验,HTML分页保持文档结构完整。实际选择需结合内容类型和性能需求。







