当前位置:首页 > PHP教程 > php应用 > 列表

PHP切割汉字的常用方法实例总结

发布:smiling 来源: PHP粉丝网  添加日期:2021-11-20 11:47:59 浏览: 评论:0 

这篇文章主要介绍了PHP切割汉字的常用方法,结合实例形式总结分析了php针对汉字的编码转换、遍历、截取等相关操作技巧,需要的朋友可以参考下。

本文实例讲述了PHP切割汉字的常用方法,分享给大家供大家参考,具体如下:

  1. <?php 
  2. /* 
  3. @UTF-8编码的字符可能由1~3个字节组成。 
  4. */ 
  5. /*--------------------------方法一截取中文字符串方法------------------------------*/ 
  6. function msubstr($str$start$len
  7.   $tmpstr = ""
  8.   $strlen = $start + $len
  9.   for ($i = 0; $i < $strlen$i++) { 
  10.     if (ord(substr($str$i, 1)) > 0xa0)  //ord()函数返回字符串的第一个字符的ASCII值 
  11.     { 
  12.       $tmpstr .= substr($str$i, 2); 
  13.       $i++; 
  14.     } else { 
  15.       $tmpstr .= substr($str$i, 1); 
  16.     } 
  17.   } 
  18.   return $tmpstr
  19. /*----------------------------第二种方法-----------------------------------*/ 
  20. //截取的是UTF-8字符串 
  21. function utf_substr($str$len
  22.   $new_str = []; 
  23.   for ($i = 0; $i < $len$i++) { 
  24.     $tem_str = substr($str, 0, 1); 
  25.     if (ord($tem_str > 127)) { 
  26.       $i++; 
  27.       if ($i < $len) { 
  28.         $new_str[] = substr($str, 0, 3); 
  29.         $str = substr($str, 3); 
  30.       } 
  31.     } else { 
  32.       $new_str[] = substr($str, 0, 1); 
  33.       $str = substr($str, 1); 
  34.     } 
  35.   } 
  36.   return join($new_str);//join()函数把数组元素组合为一个字符串 
  37. /*-------------------------------------第三种方法(UTF-8)--------------------------------*/ 
  38. function cutstr($string$length
  39.   preg_match_all("/[\x01-\x7f]|[\xc2-\xdf]|[\x80-\xbf]|\xe0[\xa0-\xbf][\x80-\xbf]|[\xe1-\xef][\x80-\xbf][\x80-\xbf]|\xf0[\x90-\xbf][\x80-\xbf][\x80-\xbf]|[\xf1-\xf7][\x80-\xbf][\x80-\xbf][\x80-\xbf]/"$string$info); 
  40.   $wordscut = ""
  41.   $j = 0; 
  42.   for ($i = 0; $i < count($info[0]); $i++) { 
  43.     $wordscut .= $info[0][$i]; 
  44.     $j = ord($info[0][$i]) > 127 ? $j + 2 : $j + 1; 
  45.     if ($j > $length - 3) { 
  46.       return $wordscut . "..."
  47.     } 
  48.   } 
  49.   return join(''$info[0]); 
  50. $string = "312哈哈,这个组合很难切割哦"
  51. echo cutstr($string, 10); 
  52. /*---------------------------------下面是曾经用过的截取第三个的字符串的------------------------------*/ 
  53. // $name1 = mysql_result($my_rst,0,"name"); 
  54. // $name = preg_match("/([1-9][0-9]+)/",$name1,$r); 
  55. // $name = $r[0]; 
  56. // if($name == ""){ 
  57. // $name=preg_replace('#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,2}'. 
  58. // '((?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,1}).*#s', 
  59. // '$1',$name1); 
  60. // } 
  61. /*--------------------------------------------第四种方法(UTF-8)---------------------------------------------*/ 
  62. function cut_str($sourcestr$cutlength
  63.   $returnstr = ''
  64.   $i = 0; 
  65.   $n = 0; 
  66.   $str_length = strlen($sourcestr);//字符串的字节数 
  67.   while ($n < $cutlength && $i <= $str_length) { 
  68.     $temp_str = substr($sourcestr$i, 1); 
  69.     $ascnum = ord($temp_str);//得到字符串中第$i位字符的ASCII码 
  70.     if ($ascnum >= 224) { 
  71.       $returnstr = $returnstr . substr($sourcestr$i, 3);//根据UTF-8编码规范,将3个连续的字符计为单个字符 
  72.       $i = $i + 3;//实际Byte记为3 
  73.       $n++;//字串长度为1 
  74.     } elseif ($ascnum >= 192)//如果ASCII位高于192 
  75.     { 
  76.       $returnstr = $returnstr . substr($sourcestr$i, 2);//根据UTF-8编码规范,将2个连续的字符记为单个字符 
  77.       $i = $i + 2;//实际Byte记为2 
  78.       $n++;//字串长度为1 
  79.     } elseif ($ascnum >= 65 && $ascnum <= 90)//如果是大写字母 
  80.     { 
  81.       $returnstr = $returnstr . substr($sourcestr$i, 1); 
  82.       $i = $i + 1;//byte记为1 
  83.       $n++;//但考虑到整体美观,大写字母计成一个高位字符 
  84.     } else { 
  85.       $returnstr = $returnstr . substr($sourcestr$i, 1); 
  86.       $i = $i + 1;//实际的Byte记为1 
  87.       $n = $n + 0.5;//小写字母和半角标点等与半个高位字符宽... 
  88.     } 
  89.   } 
  90.   if ($str_length > $cutlength) { 
  91.     $returnstr = $returnstr . "...";//超过长度时在尾处加上省略号 
  92.   } 
  93.   return $returnstr
  94. /*--------------------第五种方法(UTF-8)---------------------------------------------*/ 
  95. function FSubstr($title$start$len = ""$magic = true) 
  96.   if ($len == ""$len = strlen($title); 
  97.   if ($start != 0) { 
  98.     $startv = ord(substr($title$start, 1)); 
  99.     if ($startv >= 128) { 
  100.       if ($startv < 192) { 
  101.         for ($i = $start - 1; $i > 0; $i--) { 
  102.           $tempv = ord(substr($title$i, 1)); 
  103.           if ($tempv >= 192) break
  104.         } 
  105.         $start = $i
  106.       } 
  107.     } 
  108.   } 
  109.   if (strlen($title) <= $lenreturn substr($title$start$len); 
  110.   $alen = 0; 
  111.   $blen = 0; 
  112.   $realnum = 0; 
  113.   $length = 0; 
  114.   for ($i = $start$i < strlen($title); $i++) { 
  115.     $ctype = 0; 
  116.     $cstep = 0; 
  117.     $cur = substr($title$i, 1); 
  118.     if ($cur == "&") { 
  119.       if (substr($title$i, 4) == "&lt;") { 
  120.         $cstep = 4; 
  121.         $length += 4; 
  122.         $i += 3; 
  123.         $realnum++; 
  124.         if ($magic) { 
  125.           $alen++; 
  126.         } 
  127.       } elseif (substr($title$i, 4) == "&gt;") { 
  128.         $cstep = 4; 
  129.         $length += 4; 
  130.         $i += 3; 
  131.         $realnum++; 
  132.         if ($magic) { 
  133.           $alen++; 
  134.         } 
  135.       } elseif (substr($title$i, 5) == "&amp;") { 
  136.         $cstep = 5; 
  137.         $length += 5; 
  138.         $i += 4; 
  139.         $realnum++; 
  140.         if ($magic) { 
  141.           $alen++; 
  142.         } 
  143.       } elseif (substr($title$i, 6) == "&quot;") { 
  144.         $cstep = 6; 
  145.         $length += 6; 
  146.         $i += 5; 
  147.         $realnum++; 
  148.         if ($magic) { 
  149.           $alen++; 
  150.         } 
  151.       } elseif (preg_match("/&#(\d+);?/i"substr($title$i), $match)) { 
  152.         $cstep = strlen($match[0]); 
  153.         $length += strlen($match[0]); 
  154.         $i += strlen($match[0]) - 1; 
  155.         $realnum++; 
  156.         if ($magic) { 
  157.           $blen++; 
  158.           $ctype = 1; 
  159.         } 
  160.       } 
  161.     } else { 
  162.       if (ord($cur) >= 252) { 
  163.         $cstep = 6; 
  164.         $length += 6; 
  165.         $i += 5; 
  166.         $realnum++; 
  167.         if ($magic) { 
  168.           $blen++; 
  169.           $ctype = 1; 
  170.         } 
  171.       } elseif (ord($cur) >= 248) { 
  172.         $cstep = 5; 
  173.         $length += 5; 
  174.         $i += 4; 
  175.         $realnum++; 
  176.         if ($magic) { 
  177.           $ctype = 1; 
  178.           $blen++; 
  179.         } 
  180.       } elseif (ord($cur) >= 240) { 
  181.         $cstep = 4; 
  182.         $length += 4; 
  183.         $i += 3; 
  184.         $realnum++; 
  185.         if ($magic) { 
  186.           $blen++; 
  187.           $ctype = 1; 
  188.         } 
  189.       } elseif (ord($cur) >= 224) { 
  190.         $cstep = 3; 
  191.         $length += 3; 
  192.         $i += 2; 
  193.         $realnum++; 
  194.         if ($magic) { 
  195.           $ctype = 1; 
  196.           $blen++; 
  197.         } 
  198.       } elseif (ord($cur) >= 192) { 
  199.         $ctype = 2; 
  200.         $length += 2; 
  201.         $i += 1; 
  202.         $realnum++; 
  203.         if ($magic) { 
  204.           $blen++; 
  205.           $ctype = 1; 
  206.         } 
  207.       } elseif (ord($cur) >= 128) { 
  208.         $length += 1; 
  209.       } else { 
  210.         $cstep = 1; 
  211.         $length += 1; 
  212.         $realnum++; 
  213.         if ($magic) { 
  214.           if (ord($cur) >= 65 && ord($cur) <= 90) { 
  215.             $blen++; 
  216.           } else { 
  217.             $alen++; 
  218.           } 
  219.         } 
  220.       } 
  221.     } 
  222.     if ($magic) { 
  223.       if (($blen * 2 + $alen) == ($len * 2)) break
  224.       if (($blen * 2 + $alen) == ($len * 2) + 1) { 
  225.         if ($ctype == 1) { 
  226.           $length -= $cstep
  227.           break
  228.         } else { 
  229.           break
  230.         } 
  231.       } 
  232.     } else { 
  233.       if ($realnum == $lenbreak
  234.     } 
  235.   } 
  236.   unset($cur); 
  237.   unset($alen); 
  238.   unset($blen); 
  239.   unset($realnum); 
  240.   unset($ctype); 
  241.   unset($cstep); 
  242.   return substr($title$start$length); 
  243. function utf8Substr($str$from$len
  244.   return preg_replace('#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,' . $from . '}' . 
  245.     '((?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,' . $len . '}).*#s'
  246.     '$1'$str); 
  247. $title = "你哈珀niad1纳斯达wop asdni你爱谁都没阿斯顿撒旦12ccs- sd"
  248. $title = utf8Substr($title, 0, 15); 
  249. echo $title
  250. ?>

Tags: PHP切割汉字

分享到: