这几天复习基础时,看到字符串这一章,有个题目是给文章分页!
如是就自己动手写写。本以为很简单的,结果却折腾了两天,期间老是东看西看,东做西做的,一点也不专注………… //批评下自己
好在,终于弄出一个。只不过需要使用者自己传入当前的字符编码o(╯□╰)o。网上找到的都是利用各字符编码所在ASCII码中的十六进制区间来判断汉字………… //我承认我技术不行
下边是代码。 //写完之后就来发博客,巩固、加深印象 :-D
注:每个英文字母、汉字、特殊字符不管占多少字节,我这里始终按一个字符进行处理
转载地址:http://www.cnblogs.com/cntnn11/archive/2012/08/05/2624066.html (其实还是我)
<?php
header("content-type:text/html; charset=utf-8");
echo '<pre>';
/**
* 字符串统计,每个字符按一个长度计算
* 支持GBK,UTF8
* 类似mb_strlen()
* @author 谭宁宁
* @time 2012-08-05
*/
if( !function_exists('strcount'))
{
function strcount($string, $char='utf8')
{
$count = strlen($string);
$i = 0; //当前的字节数
$j = 0; //按照字符进行累加
while ($i<$count)
{
//英文及半角特殊字符
if(ord($string[$i]) >=0 && ord($string[$i]) <=126)
{ $charset = 'en'; }
//汉字及全角字符
else
{ $charset = $char;}
switch (strtolower($charset))
{
case 'gb2312':
case 'gbk':
$i += 1;
break;
case 'utf8':
$i += 2;
break;
case 'en':
default:
break;
}
$j++;
$i++;
}
return $j;
}
}
else
{ echo '<p>fun strcount exists!</p>'; }
/**
* 自定义字符串截取函数,防止mb_substr()没有开启
* 通过用户输入的$char来判断当前汉字的字符集编码
* @param int $start 开始的字符数
* @param int $offest 偏移量,及从$start开始往后输出多少个字符
* @param str $char 使用者手动输入当前的汉字符编码
* @author 谭宁宁
* @time 2012-08-05
*/
if( !function_exists('strsub'))
{
function strsub($string, $start=0, $offest=0, $char='utf8')
{
$count = strlen($string);
$rs = '';
$i = 0; //按字节数累计
$j = 0; //按字符数累计
$size = 1; //记录每次substr时的终止位置,汉字需要考虑gbk和utf8两种情况
while ($i < $count)
{
//英文及半角特殊字符
if(ord($string[$i]) >=0 && ord($string[$i]) <=126)
{ $charset = 'en'; }
//汉字及全角字符
else
{ $charset = $char;}
switch (strtolower($charset))
{
case 'gb2312':
case 'gbk':
$i += 1;
$size = 2;
break;
case 'utf8':
$i += 2;
$size = 3;
break;
case 'en':
default:
$size = 1;
break;
}
if($j < intval($start+$offest) && $j >= $start)
{
$tstart = intval($i-$size)+1;
$rs .= substr($string, $tstart, $size);
}
$j++;
$i++;
}
return $rs;
}
}
else
{ echo '<p>fun strsub exists!</p>'; }
/*$string = '123456789汉字胡总温中文啊abcdefghijklmn·=-';
echo 'substr():',substr($string, 9, 3),'<br />';
echo '长度:',strcount($string),'<br />';
echo '截取测试:',strsub($string, 0, 11),'<br />';*/
$fileContent = file_exists('reg.txt') ? file_get_contents('reg.txt') : '';
$count = strcount($fileContent);
$page = !isset($_GET['p']) ? 1 : $_GET['p']; //获取当前页码,默认为1
$pagesize = 350; //每页多少字符
$pagecount = $count/$pagesize;
$pagecount = strpos($pagecount, '.') ? intval($pagecount)+1 : intval($pagecount); //总页码,如果出现小数,那么就得+1页
$start = $page<=1 ? 0 : ($page-1)*$pagesize;
$fileContent = strsub($fileContent, $start, $pagesize, 'utf8');
?>
<header>
<style type="text/css">
p
{ margin: 10px; word-wrap: break-word; border:#000 1px solid; padding:5px; }
p a
{ margin: 5px; }
</style>
</header>
<body>
<p><?php echo $fileContent; ?></p>
<p>
<?php
echo "共有字符:$count /每页 $pagesize 个 ";
echo " 共 $pagecount 页/当前第 $page 页";
if($page <= 1)
{
echo '<a>首页</a>';
echo '<a>上一页</a>';
}
else
{
$up = $page-1;
echo "<a href='/contentpage.php?p=1'>首页</a>";
echo "<a href='/contentpage.php?p=$up'>上一页</a>";
}
if($page == $pagecount)
{
echo '<a>下一页</a>';
echo '<a>尾页</a>';
}
else
{
$down = $page+1;
echo "<a href='/contentpage.php?p=$down'>下一页</a>";
echo "<a href='/contentpage.php?p=$pagecount'>尾页</a>";
}
?>
</p>