1 <?php 2 //分析写在注释中 3 class StringComponent{ 4 //大致原理就是一个一个字节去读,如果第一个字符ascll数值大于224连续三个组成一个字,如果大于192就是2个,否则就是一个字母或标点 5 public static function cutString($sourceStr, $cutLength = 10, $extStr = '...'){ 6 $returnStr = ''; $i = 0; $n = 0; //$i用于指针,$n 统计字符长度 7 $strLength = strlen($sourceStr); //获取字符长度,注意这个不是字数的个数 8 if ($strLength > $cutLength){ //判断参数合法 9 while (($n < $cutLength) and ($i <= $strLength)){ //限定循环范围 10 $tempStr = substr($sourceStr, $i, 1); //取出指针下一个字符 11 $ascnum = Ord($tempStr); //取出ascll值 12 if ($ascnum >= 224){ //判断值的大小 13 $returnStr = $returnStr . substr($sourceStr, $i, 3); //弹出取到的汉字到结果中 14 $i = $i+3; //指针移动三个字符长度 15 $n++; //字数统计+1 16 }elseif ($ascnum >= 192){ 17 $returnStr=$returnStr.substr($sourceStr,$i,2); //如上 18 $i=$i+2; 19 $n++; 20 }elseif ($ascnum >= 65 && $ascnum <= 90){ 21 $returnStr = $returnStr.substr($sourceStr, $i, 1); //如上 22 $i = $i+1; 23 $n++; 24 }else{ 25 $returnStr = $returnStr.substr($sourceStr, $i, 1); //这里要说下,如果小于65就是标点字符了,算作0.5个字符 26 $i = $i+1; 27 $n = $n+0.5; 28 } 29 } 30 if ($strLength > $i){ 31 $returnStr = $returnStr.$extStr; //如果结果字符串小于长度那么,填上后缀标志 32 } 33 return $returnStr; 34 } 35 else 36 return $sourceStr; //如果截取长度大于总长,返回原来的字符串 37 } 38 } 39 40 ?>