php 中文字符串统计、截取

来源:互联网 发布:linux ping 显示时间 编辑:程序博客网 时间:2024/06/03 19:43

这几天复习基础时,看到字符串这一章,有个题目是给文章分页!

如是就自己动手写写。本以为很简单的,结果却折腾了两天,期间老是东看西看,东做西做的,一点也不专注………… //批评下自己

好在,终于弄出一个。只不过需要使用者自己传入当前的字符编码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>