php长文章分页原理与实现程序

办法一、按字数控制进行分页

按字数分页办法简单易用,但效果不好。

大致思想:首先、设定每页能容纳的最大字数;然后、计算文章内容的总字数,再由总字数和单页最大字数计算出出总页数。这样整个分页的准备工作就已经做好了。

具体到每一页的显示内容可以通过内容截取来实现。比如:页容纳500字,文章内容有2200字,那么当页面传递page=2时应该显示第501至1000之间的内容。

这种办法简单,但显示时可能会遇到麻烦,文章内容通常伴有HTML标签,进行内容切割时实现HTML标签的闭合有一定难度,如果这个工作没做好,那么分页后的效果显然也是不好的。

代码如下:

  1. <?php
  2. $content1="内容要很长。。。。。。";
  3. $current=$_REQUEST['page_t'];
  4. $result=ff_page($content1,$current);
  5. echo $result;
  6. function ff_page($content,$page)
  7. {
  8. global $expert_id;
  9. if (emptyempty($page)) {
  10. $page = 1 ;
  11. } //给$page赋初始值
  12. $PageLength = 2000; //每页字数
  13. $CLength = strlen($content); //文章长度
  14. $PageCount = floor(($CLength / $PageLength)) + 1; //计算页数
  15. $PageArray=array();//断页位置数组
  16. $Seperator = array("n","r","。","!","?",";",",","”","’",".","!","?",";"); //分隔符号
  17. //echo "页数:".$PageCount."<br >";
  18. //echo "长度:".$CLength."<br >";
  19. //strpos() 函数返回字符串在另一个字符串中第一次出现的位置
  20. if($CLength <= $PageLength)
  21. {
  22. echo $content;
  23. }//如果只有一页,直接打印
  24. else{
  25. $PageArray[0]=0;
  26. $Pos = 0;
  27. $i=0;
  28. //第一页,print_r($Seperator);
  29. for( $j=0 ; $j < sizeof($Seperator); $j++)
  30. {
  31. $Pos=strpos($content,$Seperator[$j],$PageArray[$i]+1900);
  32. while($Pos > 0 && $Pos<($i+1)*$PageLength && $Pos > $i*$PageLength )
  33. {
  34. $PageArray[$i] = $Pos ;
  35. if ($Pos+$PageLength > $CLength)
  36. {
  37. $start_p = $CLength-1 ;
  38. }
  39. else{
  40. $start_p = $Pos+$PageLength ;
  41. }
  42. //给一个找寻位置的起始点,防止超过位置总字符数
  43. $Pos = strpos($content,$Seperator[$j],$start_p) ;
  44. }
  45. //如果已经找到分页点,跳出循环
  46. if($PageArray[$i]>0)
  47. {
  48. $j = $j + sizeof($Seperator) + 1;
  49. }
  50. }
  51. for( $i = 1; $i < $PageCount-1; $i++ )
  52. {
  53. for( $j = 0 ; $j < sizeof($Seperator); $j++)
  54. {
  55. $Pos=strpos($content,$Seperator[$j],$PageArray[$i-1]+1900);
  56. while($Pos > 0 && $Pos < ($i+1)*$PageLength && $Pos > $i*$PageLength )
  57. {
  58. $PageArray[$i] = $Pos ;
  59. if ($Pos+$PageLength > $CLength)
  60. {
  61. $start_p2 = $CLength-1 ;
  62. }
  63. else{
  64. $start_p2 = $Pos+$PageLength ;
  65. }
  66. $Pos = strpos($content,$Seperator[$j],$start_p2) ;
  67. }
  68. if($PageArray[$i]>0)
  69. {
  70. $j = $j + sizeof($Seperator) + 1;
  71. }
  72. }
  73. }
  74. //--PHP长文章分页函数最后一页
  75. $PageArray[$PageCount-1] = $CLength;
  76. //$page=2;
  77. if($page==1)
  78. {
  79. $output=substr($content,0,$PageArray[$page-1]+2);
  80. }
  81. if($page > 1 && $page <= $PageCount)
  82. {
  83. $output=substr($content,$PageArray[$page-2]+2,$PageArray[$page-1]-$PageArray[$page-2]);
  84. $output=" (上接第".($page-1)."页)n".$output;
  85. }
  86. // echo str_replace("n","<br >&nbsp;&nbsp;&nbsp;",$output); //回车换行,根据需要调整
  87. echo $output ;
  88. if($PageCount > 1)
  89. {
  90. echo "<br ><center>";
  91. echo "<font color='ff0000'>".$page."</font>/".$PageCount."页 &nbsp;";
  92. if($page>1)
  93. echo "<a href=$PHP_SELF?expert_.($page-1).">上一页</a> ";
  94. else
  95. echo "上一页 ";
  96. for( $i=1 ; $i <= $PageCount ; $i++)
  97. {
  98. echo "<a href=$PHP_SELF?expert_.$i.">[".$i."]</a> ";
  99. }
  100. if($page < $PageCount)
  101. echo " <a href=$PHP_SELF?expert_.($page+1).">下一页</a> ";
  102. else
  103. echo " 下一页 ";
  104. echo "</center>";
  105. }
  106. }
  107. }
  108. ?>

办法二、通过分页符进行分页

通过分页符进行分页比起第一种办法要更为理想。

大致思想:在编辑文章内容时往内容里面插入分页符(如:<hr>),在文章显示时对文章内容进行分割,每一部分表示一个页的内容,通过传递参数控制显示第几页。
这种办法比较人性化,毕竟通过人工控制出来的分页截取的内容更符全我们的思维,而且可以一定程度上避免HTML标签不闭合的情形。

文章内容分页代码,是根据由编辑器插入的分页符来操作了,我们可以分出超漂亮的偏移效果的分页。

代码如下:

  1. <style type="text/css">
  2. <!--
  3. body {
  4. width:800px;
  5. margin:0 auto;
  6. margin-top:50px;
  7. font-size:12px;
  8. }
  9. a {
  10. color:#014ccc;
  11. text-decoration:none;
  12. }
  13. .div {
  14. float:left;
  15. cursor:pointer;
  16. font-weight:bold;
  17. margin-right:5px;
  18. display: block;
  19. padding:3px 7px;
  20. text-align:center;
  21. border:#bbdded solid 1px;
  22. }
  23. .divs {
  24. float:left;
  25. font-weight:bold;
  26. margin-right:5px;
  27. display: block;
  28. padding:3px 7px;
  29. text-align:center;
  30. border:#cccccc solid 1px;
  31. }
  32. .divsi {
  33. float:left;
  34. font-weight:bold;
  35. margin-right:5px;
  36. display: block;
  37. padding:3px 7px;
  38. text-align:center;
  39. background:#3399ff;
  40. color:#ffffff;
  41. border:#cccccc solid 1px;
  42. }
  43. .div:hover {
  44. background:#3399ff;
  45. color:#ffffff;
  46. }
  47. .divsi:hover {
  48. background:#3399ff;
  49. color:#ffffff;
  50. }
  51. -->
  52. </style>
  53. class contentpage
  54. {
  55. private $content; //文章内容
  56. private $pagesize; //每页最少字节数
  57. private $breakflag; //分页符(可以自定义,默认为n)
  58. private $pageurl; //url地址
  59. private $pagevar; //分页参数
  60. public $pagecount; //总页数
  61. public $page; //当前页码
  62. public $pagebreak; //每页起始位置
  63. function __construct($content = "",$pagesize = 10,$breakflag ="n",$pageurl = '',$pagevar = 'p')
  64. {
  65. $this->content = $content;
  66. $this->pagesize = $pagesize;
  67. $this->breakflag = $breakflag;
  68. $this->pageurl = $pageurl;
  69. $this->pagevar = $pagevar;
  70. $this->getpages();
  71. }
  72. //总页数,每页的起始位置和结束位置
  73. public function getpages()
  74. {
  75. $contentlen = strlen($this->content); //文章总字节数
  76. $this->pagebreak[0] = 0;
  77. $i = 0;
  78. $offset = $this->pagesize;
  79. for ($k=0;$k<$contentlen/$this->pagesize;$k++)
  80. {
  81. if($offset > $contentlen)
  82. {
  83. $i++;
  84. $this->pagebreak[$i] = $contentlen;
  85. break;
  86. }
  87. //查找$this->pagevar出现的位置
  88. $where = strpos($this->content,$this->breakflag,$offset);
  89. if($where > $contentlen or intval($where) < 1)
  90. {
  91. $i++;
  92. $this->pagebreak[$i] = $contentlen;
  93. break;
  94. }
  95. else
  96. {
  97. $i++;
  98. $this->pagebreak[$i] = $where;
  99. $offset = $where + $this->pagesize;
  100. }
  101. }
  102. $this->pagecount = $i;
  103. if(isset($_get[$this->pagevar]) && $_get[$this->pagevar] >1 && $_get[$this->pagevar] <= $this->pagecount)
  104. {
  105. $this->page = $_get[$this->pagevar];
  106. }
  107. else
  108. {
  109. $this->page = 1;
  110. }
  111. }
  112. //每页内容
  113. function getpage()
  114. {
  115. //截取当前页码的数据
  116. if($this->page > 1)
  117. {
  118. return substr($this->content,$this->pagebreak[$this->page-1]+1,$this->pagebreak[$this->page] - $this->pagebreak[$this->page-1]);
  119. }
  120. else
  121. {
  122. return substr($this->content,$this->pagebreak[$this->page-1],$this->pagebreak[$this->page] - $this->pagebreak[$this->page-1]);
  123. }
  124. }
  125. //分页条
  126. public function getpagenav()
  127. {
  128. if($this->page > 1)
  129. {
  130. $pagenav = "<a href='".$this->geturl()."=".($this->page-1)."' class='div'>上一页</a>&nbsp;&nbsp;";
  131. }
  132. //输出数字页码
  133. for($j=1;$j<=$this->pagecount;$j++)
  134. {
  135. if($j == $this->page)
  136. {
  137. $pagenav .= "<span class='divsi'>".$j."</span>&nbsp;&nbsp;";
  138. }
  139. else
  140. {
  141. $pagenav .= "<a href='".$this->geturl()."=".$j."' class='div'>".$j."</a>&nbsp;&nbsp;";
  142. }
  143. }
  144. //下一页
  145. if($this->page < $this->pagecount && $this->pagecount >1)
  146. {
  147. $pagenav .= "<a href='".$this->geturl()."=".($this->page+1)."' class='div'>下一页</a>&nbsp;&nbsp;";
  148. }
  149. return $pagenav;
  150. }
  151. //获取url地址
  152. public function geturl()
  153. {
  154. $url = $_server['request_uri'];
  155. $parse_url = parse_url($url);
  156. $query_url = $parse_url['query'];
  157. if($query_url)
  158. {
  159. $query_url = ereg_replace("(^|&)".$this->pagevar."=".$this->page,"",$query_url);
  160. $url = str_replace($parse_url['query'],$query_url,$url);
  161. if($query_url)
  162. {
  163. $url .= "&".$this->pagevar;
  164. }
  165. else
  166. {
  167. $url .= $this->pagevar;
  168. }
  169. }
  170. else
  171. {
  172. $url .= "?".$this->pagevar;
  173. }
  174. return $url;
  175. }
  176. }
  177. $content = "第一页:文章内容分页阿斯顿浪费空间阿斯顿来看福建省地方吉林省福建路口附近大手拉飞机上浪费的说浪费监理费
  178. 第二页:阿斯顿房间阿双方了解啊对萨拉开发记得谁来付款将令对方空间的来福建阿里是否
  179. 第三页:欧文炯诶哦生地拉开方面来看就继续超文章内容分页滤机蓝卡
  180. 第四页:欧文日据拉萨及发动四分啊就双方的将爱是发觉是文章内容分页否了。";
  181. $model = new contentpage($content);
  182. echo $model->getpage(); //输出分页内容
  183. echo $model->getpagenav(); //输出页码
  184. ?>