php 中文字符串统计、截取

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

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

好在,终于弄出一个。只不过需要使用者自己传入当前的字符编码o(╯□╰)o。网上找到的都是利用各字符编码所在ASCII码中的十六进制区间来判断汉字………… //我承认我技术不行

下边是代码。 //写完之后就来发博客,巩固、加深印象 :-D

注:每个英文字母、汉字、特殊字符不管占多少字节,我这里始终按一个字符进行处理

  1 <?php
  2 header("content-type:text/html; charset=utf-8");
  3 echo '<pre>';
  4 /**
  5  *    字符串统计,每个字符按一个长度计算
  6  *        支持GBK,UTF8
  7  *    类似mb_strlen()
  8  *    @author 谭宁宁
  9  *    @time 2012-08-05
 10  */    
 11 if( !function_exists('strcount'))
 12 {
 13     function strcount($string, $char='utf8')
 14     {
 15         $count    = strlen($string);
 16         $i        = 0;    //当前的字节数
 17         $j        = 0;    //按照字符进行累加
 18         while ($i<$count)
 19         {
 20             //英文及半角特殊字符
 21             if(ord($string[$i]) >=0 && ord($string[$i]) <=126)
 22             {    $charset    = 'en';    }
 23             //汉字及全角字符
 24             else
 25             {    $charset    = $char;}
 26 
 27             switch (strtolower($charset))
 28             {
 29                 case 'gb2312':
 30                 case 'gbk':
 31                     $i        += 1;
 32                     break;
 33                 case 'utf8':
 34                     $i        += 2;
 35                     break;
 36                 case 'en':
 37                 default:
 38                     break;
 39             }
 40             $j++;
 41             $i++;
 42         }
 43         return $j;
 44     }
 45 }
 46 else
 47 {    echo '<p>fun strcount exists!</p>';    }
 48 
 49 /**
 50  *    自定义字符串截取函数,防止mb_substr()没有开启
 51  *    通过用户输入的$char来判断当前汉字的字符集编码
 52  *    @param int $start 开始的字符数
 53  *    @param int $offest 偏移量,及从$start开始往后输出多少个字符
 54  *    @param str $char 使用者手动输入当前的汉字符编码
 55  *    @author 谭宁宁
 56  *    @time 2012-08-05
 57  */    
 58 if( !function_exists('strsub'))
 59 {
 60     function strsub($string, $start=0, $offest=0, $char='utf8')
 61     {
 62         $count    = strlen($string);
 63         $rs        = '';
 64         $i        = 0;    //按字节数累计
 65         $j        = 0;    //按字符数累计
 66         $size    = 1;    //记录每次substr时的终止位置,汉字需要考虑gbk和utf8两种情况
 67         while ($i < $count)
 68         {
 69             //英文及半角特殊字符
 70             if(ord($string[$i]) >=0 && ord($string[$i]) <=126)
 71             {    $charset    = 'en';    }
 72             //汉字及全角字符
 73             else
 74             {    $charset    = $char;}
 75             
 76             switch (strtolower($charset))
 77             {
 78                 case 'gb2312':
 79                 case 'gbk':
 80                     $i        += 1;
 81                     $size    = 2;
 82                     break;
 83                 case 'utf8':
 84                     $i        += 2;
 85                     $size    = 3;
 86                     break;
 87                 case 'en':
 88                 default:
 89                     $size    = 1;
 90                     break;
 91             }
 92             
 93             if($j < intval($start+$offest) && $j >= $start)
 94             {
 95                 $tstart    = intval($i-$size)+1;
 96                 $rs        .= substr($string, $tstart, $size);
 97             }
 98             $j++;
 99             $i++;
100         }
101         return $rs;
102     }
103 }
104 else
105 {    echo '<p>fun strsub exists!</p>';    }
106 
107 /*$string    = '123456789汉字胡总温中文啊abcdefghijklmn·=-';
108 echo 'substr():',substr($string, 9, 3),'<br />';
109 echo '长度:',strcount($string),'<br />';
110 echo '截取测试:',strsub($string, 0, 11),'<br />';*/
111 
112 $fileContent    = file_exists('reg.txt') ? file_get_contents('reg.txt') : '';
113 
114 $count            = strcount($fileContent);
115 $page            = !isset($_GET['p']) ? 1 : $_GET['p'];    //获取当前页码,默认为1
116 $pagesize        = 350;    //每页多少字符
117 $pagecount        = $count/$pagesize;
118 $pagecount        = strpos($pagecount, '.') ? intval($pagecount)+1 : intval($pagecount);    //总页码,如果出现小数,那么就得+1页
119 $start            = $page<=1 ? 0 : ($page-1)*$pagesize;
120 
121 $fileContent    = strsub($fileContent, $start, $pagesize, 'utf8');
122 ?>
123 
124 <header>
125 <style type="text/css">
126 p
127 {    margin: 10px; word-wrap: break-word; border:#000 1px solid; padding:5px;    }
128 p a
129 {    margin: 5px;    }
130 </style>
131 </header>
132 <body>
133 <p><?php echo $fileContent; ?></p>
134 
135 <p>
136 <?php
137 echo "共有字符:$count /每页 $pagesize 个&nbsp;&nbsp;";
138 echo "&nbsp;共 $pagecount 页/当前第 $page 页";
139 
140 if($page <= 1)
141 {
142     echo '<a>首页</a>';
143     echo '<a>上一页</a>';
144 }
145 else
146 {
147     $up    = $page-1;
148     echo "<a href='/contentpage.php?p=1'>首页</a>";
149     echo "<a href='/contentpage.php?p=$up'>上一页</a>";
150 }
151 
152 if($page == $pagecount)
153 {
154     echo '<a>下一页</a>';
155     echo '<a>尾页</a>';
156 }
157 else
158 {
159     $down    = $page+1;
160     echo "<a href='/contentpage.php?p=$down'>下一页</a>";
161     echo "<a href='/contentpage.php?p=$pagecount'>尾页</a>";
162 }
163 ?>
164 </p>
posted @ 2012-08-05 18:12  cntnn11  阅读(743)  评论(0编辑  收藏  举报