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 个 "; 138 echo " 共 $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>