Typecho 长文章利用 PHP 分页实现方法

小助手读文章 00:00 / 00:00

温馨提示:
本文所述内容不具普遍性,可能因操作环境差异而与实际有所出入,故请勿照搬照抄,仅供参考。

二、实现

I、代码

考虑到体验及性能,本文采用 PHP 将长文章内容分页,可以自动分页,也可以手动分页。

<?php    
/*  
*  长文章分页类     
*/  
    class cutpage{    
        private $pagestr;           //要处理的内容    
        private $pagearr;   
        private $sum_word;      //总字数(UTF-8格式的中文字符也包括)    
        private $sum_page;      //总页数    
        private $page_word;     //一页多少字    
        private $cut_tag;       //自动分页符    
        private $cut_custom;    //手动分页符    
        private $ipage;         //当前切分的页数,第几页    
        private $url;    
        
        function __construct($pagestr,$page_word=1000){    
            $this->page_word = $page_word;    
            $this->cut_tag = array("</table>", "</div>", "</p>", "<br/>", "”。", "。", ".", "!", "……", "?", ",");    
            $this->cut_custom = "{ nextpage}";    
            @$tmp_page = intval(trim($_GET["ipage"]));    
            $this->ipage = $tmp_page>1?$tmp_page:1; 
            $this->pagestr = $pagestr;
        }    
        
        function cut_str(){    
            $str_len_word = strlen($this->pagestr);     //获取使用 strlen 得到的字符总数    
            $i = 0;    
            if ($str_len_word<=$this->page_word){     //如果总字数小于一页显示字数    
                $page_arr[$i] = $this->pagestr;    
            }else{    
                if (strpos($this->pagestr, $this->cut_custom)){    
                    $page_arr = explode($this->cut_custom, $this->pagestr);    
                }else{    
                    $str_first = substr($this->pagestr, 0, $this->page_word); 
                    foreach ($this->cut_tag as $v){    
                        $cut_start = strrpos($str_first, $v);       //逆向查找第一个分页符的位置    
                        if ($cut_start){    
                            $page_arr[$i++] = substr($this->pagestr, 0, $cut_start).$v;    
                            $cut_start = $cut_start + strlen($v);    
                            break;    
                        }    
                    }    
                    if (($cut_start+$this->page_word)>=$str_len_word){    //如果超过总字数    
                        $page_arr[$i++] = substr($this->pagestr, $cut_start, $this->page_word);    
                    }else{    
                        while (($cut_start+$this->page_word)<$str_len_word){    
                            foreach ($this->cut_tag as $v){    
                                $str_tmp = substr($this->pagestr, $cut_start, $this->page_word);        // 取第 cut_start 个字后的 page_word 个字符    
                                $cut_tmp = strrpos($str_tmp, $v);       // 找出从第 cut_start 个字之后,page_word 个字之间,逆向查找第一个分页符的位置    
                                if ($cut_tmp){    
                                    $page_arr[$i++] = substr($str_tmp, 0, $cut_tmp).$v;    
                                    $cut_start = $cut_start + $cut_tmp + strlen($v);    
                                    break;    
                                }    
                            }      
                        }    
                        if (($cut_start+$this->page_word)>$str_len_word){    
                            $page_arr[$i++] = substr($this->pagestr, $cut_start, $this->page_word);    
                        }    
                    }    
                }    
            }    
            $this->sum_page = count($page_arr);     //总页数    
            $this->pagearr = $page_arr;  
            return $page_arr;
        }    
        //显示上一条,下一条    
        function pagenav(){    
            $this->set_url();    
            $str = '';
            
            //$str .= $this->ipage.'/'.$this->sum_page;
            
            for($i=1;$i<=$this->sum_page;$i++){
                if($i==$this->ipage) {
                    $str.= "<a href='#' class='cur'>".$i."</a> ";
                }else{
                    $str.= "<a href='".$this->url.$i."'>".$i."</a> ";
                }
            }
                
            return $str;    
        }    
          
        function set_url(){    
            parse_str($_SERVER["QUERY_STRING"], $arr_url);    
            unset($arr_url["ipage"]);    
            if (empty($arr_url)){    
                $str = "ipage=";    
            }else{    
                $str = http_build_query($arr_url)."&ipage=";    
            }    
            $this->url = "http://".$_SERVER["HTTP_HOST"].$_SERVER["PHP_SELF"]."?".$str;    
        }    
    }    
?>

以上 cutpage 类可以非常好的处理内容分页,能处理不同 html 标签给分页带来的麻烦。如果内容设置了分页符 { nextpage},则会优先自动将内容按分页符分页。

II、调用分页类

这里我们假设读取了文件 text.txt 的文章内容,实际项目中应该是表单提交长内容或者读取数据库相关表的内容。然后实例化分页类,再根据当前页调用对应分页的内容并输出,以及输出分页条。

<?php
$content = file_get_contents('text.txt');    
    @$ipage = $_GET["ipage"]? intval($_GET["ipage"]):1;    
    $CP = new cutpage($content);    
    $page = $CP->cut_str();  
    echo $page[$ipage-1];   
    echo $CP->pagenav();
?>


ArmxMod for Typecho
个性化、自适应、功能强大的响应式主题

推广

 继续浏览关于 phptypechowordpress分页长文章 的文章

 本文最后更新于 2018/12/23 19:22:02,可能因经年累月而与现状有所差异

 引用转载请注明: VirCloud's Blog > 建站 > Typecho 长文章利用 PHP 分页实现方法

精选评论

  1. 木对
    木对 回复

    Windows 10Chrome 78.0.3904.87来自 广东 的大神

    大佬能不能做成typecho插件呀?实在需要自动分页这个功能!谢谢

  2. 核蛋
    核蛋 回复

    iPhone 13_4Safari 604.1来自 四川 的大神

    大佬,你那个调用里面的用的text.txt是啥呀,我用content不行,你这个博客用的啥呀
    $content = file_get_contents('text.txt');

    1. 欧文斯

      text.txt 是指要分页的内容

  3. Ludou
    Ludou 回复

    Mac OS X 10_15_7Chrome 106.0.0.0来自 香港 的大神

    摩拜!
    请教大佬,分页URL能否实现伪静态呢。例如现在是xxx.html?ipage=2 改为 xxx-2.html 或者 xxx.html/2

    感谢了

    1. 欧文斯

      理论上是可以的,你可以试试看