经测试代码如下:
/**
* 文章分页类
*
* @param
* @author 编程之家 jb51.cc jb51.cc
**/
/*
For example:
$curPage = $_GET['page'];
$totalPage = $curPage;
$objArt = new article($article,40,14);
$objArt->setWrapSign("<br/>");
$objArt->setMore('more','this is complete url address.');
$part = $objArt->getOnePage($curPage,$totalPage);
echo $part;
*/
class article {
var $string = '';
var $curPart = '';
var $allLine = 0;
var $totalPage = null;
var $curPage = 1;
var $curLine = 1;
var $onePageLine = 10;
var $oneLineWord = 40;
var $arrArticle = array();
var $wrapSign = "\n";
var $more = null;
function article($str,$oneLineWord = 40,$onePageLine = 10)
{
$this->string = $str;
$this->oneLineWord = $oneLineWord;
$this->onePageLine = $onePageLine;
}
//设置换行符
function setWrapSign($str)
{
$this->wrapSign = $str;
}
//是否显示更多
function setMore($str,$link)
{
$this->more = array('word' => $str,'url' => $link);
}
//设置总页面、总行数,构造文章数组
function getAllPage($str='')
{
if ($str)
$this->string = $str;
$this->allLine = 0;
$arrayStr = explode($this->wrapSign,$this->string);
foreach ($arrayStr as $num => $part) {
$length = $this->strlen($part);
if ($length > $this->oneLineWord) {
$tmp_line = ceil($length / $this->oneLineWord);
} else {
$tmp_line = 1;
}
$this->allLine += $tmp_line;
$this->arrArticle[$num] = array(
'lines' => $tmp_line,'string' => $part
);
}
$this->totalPage = ceil($this->allLine / $this->onePageLine);
return $this->totalPage;
}
//获取某页数据
function getOnePage($page,&$totalPage)
{
if (is_null($this->totalPage))
$this->getAllPage();
$totalPage = $this->totalPage;
!$page && $page = 1;
$page > $totalPage && $page = $totalPage;
$this->curPage = $page;
$startLine = ($page - 1) * $this->onePageLine + 1;
$endLine = $startLine + $this->onePageLine - 1;
$tmp_line = 0; $tmp_str = ''; $key = count($this->arrArticle);
foreach ($this->arrArticle as $k => $part) {
$tmp_line += $part['lines'];
if ($startLine > 1 && $tmp_line - $part['lines'] < $startLine && $tmp_line >= $startLine)
{
$tmp_str = '';
$startWord = ($startLine - ($tmp_line - $part['lines'] + 1)) * $this->oneLineWord;
$startWord = $startWord < 0 ? 0 : $startWord;
$needWord = $this->oneLineWord * $this->onePageLine;
$part['string'] = $this->substr($part['string'],$startWord,$needWord);
if ($tmp_line == $endLine)
$this->_setLastLine($part['string']);
}
else if ($tmp_line == $startLine - 1)
{
$tmp_str = '';
continue;
}
else if ($tmp_line > $endLine)
{
$needWord = ($endLine - ($tmp_line - $part['lines'])) * $this->oneLineWord;
$part['string'] = $this->substr($part['string'],$needWord);
$this->_setLastLine($part['string']);
}
$tmp_str .= $part['string'];
if ($tmp_line < $endLine && $k + 1 < $key)
$tmp_str .= '<br/>';
else if ($tmp_line >= $endLine || $k + 1 == $key) {
$this->_setLastLine($part['string']);
break;
}
}
$this->curPart = $tmp_str;
if (!is_null($this->more)) $this->_setMore();
return $this->curPart;
}
//设置最后一行数据
function _setLastLine($str)
{
$this->getAllPage($str);
$startWord = ($this->allLine - 1) * $this->oneLineWord;
$this->lastLine = $this->substr($str,$this->oneLineWord);
}
//获取最后一行数据
function getLastLine()
{
return $this->lastLine;
}
//对 more 进行设置
function _setMore()
{
$length = $this->strlen($this->lastLine);
if ($length + 15 > $this->oneLineWord) {
$length = $this->strlen($this->curPart);
$this->curPart = $this->substr($this->curPart,$length - 9) . ' ... <a href="'.$this->more['url'].'">'.$this->more['word'].'</a>';
} else {
$this->curPart .= ' ... <a href="'.$this->more['url'].'">'.$this->more['word'].'</a>';
}
}
//支持中文的字符串长度获取(每2个字符表示一个中文字符)
function strlen($str)
{
$length = 0;
for($i = 0,$len = strlen($str);$i < $len; ++ $i) {
$w = substr($str,$i,1);
if (ord($w) > 160) {
$length += 2;
$i += 2;
} else
$length ++;
}
return $length;
}
//截取字符串,长度不足则舍弃
function substr($str,$start,$len)
{
$string = '';
$length = strlen($str);
$tmp_len = 0; $tmp_start = 0;
for($i = 0;$i < $length; ++ $i) {
if ($tmp_len >= $len) break;
if ($i + 1 >= $start) {//die(','.$tmp_start);
$w = substr($str,$tmp_start,1);
if (ord($w) > 160) {
if ($tmp_len + 2 <= $len)
$string .= substr($str,3);
$i += 2;
$tmp_len += 2;
$tmp_start += 3;
} else {
$string .= substr($str,1);
++ $tmp_start;
++ $tmp_len;
}
} else {
$w = substr($str,1);
if (ord($w) > 160) {
$i += 1;
$tmp_start += 3;
} else {
++ $tmp_start;
}
}
}
return $string;
}
}
For example:
$curPage = $_GET['page'];
$totalPage = $curPage;
$objArt = new article($article,14);
$objArt->setWrapSign("<br/>");
$objArt->setMore('more','this is complete url address.');
$part = $objArt->getOnePage($curPage,$totalPage);
echo $part;
/*** 代码来自编程之家 jb51.cc(jb51.cc) ***/
原文链接:https://www.f2er.com/php/529057.html