您好,欢迎访问一九零五行业门户网

php 中文字符串统计、截取

这几天复习基础时,看到字符串这一章,有个题目是给文章分页! 如是就自己动手写写。本以为很简单的,结果却折腾了两天,期间老是东看西看,东做西做的,一点也不专注 //批评下自己 好在,终于弄出一个。只不过需要使用者自己传入当前的字符编码 o(╯□╰)o
这几天复习基础时,看到字符串这一章,有个题目是给文章分页!
如是就自己动手写写。本以为很简单的,结果却折腾了两天,期间老是东看西看,东做西做的,一点也不专注………… //批评下自己
好在,终于弄出一个。只不过需要使用者自己传入当前的字符编码o(╯□╰)o。网上找到的都是利用各字符编码所在ascii码中的十六进制区间来判断汉字………… //我承认我技术不行
下边是代码。 //写完之后就来发博客,巩固、加深印象 :-d
注:每个英文字母、汉字、特殊字符不管占多少字节,我这里始终按一个字符进行处理
1 php 2 header(content-type:text/html; charset=utf-8); 3 echo ''; 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]) ) 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 'fun strcount exists!
'; } 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]) ) 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 else105 { echo 'fun strsub exists!
'; }106 107 /*$string = '123456789汉字胡总温中文啊abcdefghijklmn·=-';108 echo 'substr():',substr($string, 9, 3),'
';109 echo '长度:',strcount($string),'
';110 echo '截取测试:',strsub($string, 0, 11),'
';*/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']; //获取当前页码,默认为1116 $pagesize = 350; //每页多少字符117 $pagecount = $count/$pagesize;118 $pagecount = strpos($pagecount, '.') ? intval($pagecount)+1 : intval($pagecount); //总页码,如果出现小数,那么就得+1页119 $start = $page$page-1)*$pagesize;120 121 $filecontent = strsub($filecontent, $start, $pagesize, 'utf8');122 ?>123 124 header>125 131 header>132 133
134 135 136 php137 echo 共有字符:$count /每页 $pagesize 个  ;138 echo  共 $pagecount 页/当前第 $page 页;139 140 if($page )141 {142 echo '首页';143 echo;144 }145 else146 {147 $up = $page-1;148 echo 首页;149 echo 尾页';156 }157 else158 {159 $down = $page+1;160 echo 尾页;162 }163 ?>164

其它类似信息

推荐信息