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


Posted in PHP onApril 27, 2019

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

<?php
/*
@UTF-8编码的字符可能由1~3个字节组成。
*/
/*--------------------------方法一截取中文字符串方法------------------------------*/
function msubstr($str, $start, $len)
{
  $tmpstr = "";
  $strlen = $start + $len;
  for ($i = 0; $i < $strlen; $i++) {
    if (ord(substr($str, $i, 1)) > 0xa0)  //ord()函数返回字符串的第一个字符的ASCII值
    {
      $tmpstr .= substr($str, $i, 2);
      $i++;
    } else {
      $tmpstr .= substr($str, $i, 1);
    }
  }
  return $tmpstr;
}
/*----------------------------第二种方法-----------------------------------*/
//截取的是UTF-8字符串
function utf_substr($str, $len)
{
  $new_str = [];
  for ($i = 0; $i < $len; $i++) {
    $tem_str = substr($str, 0, 1);
    if (ord($tem_str > 127)) {
      $i++;
      if ($i < $len) {
        $new_str[] = substr($str, 0, 3);
        $str = substr($str, 3);
      }
    } else {
      $new_str[] = substr($str, 0, 1);
      $str = substr($str, 1);
    }
  }
  return join($new_str);//join()函数把数组元素组合为一个字符串
}
/*-------------------------------------第三种方法(UTF-8)--------------------------------*/
function cutstr($string, $length)
{
  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);
  $wordscut = "";
  $j = 0;
  for ($i = 0; $i < count($info[0]); $i++) {
    $wordscut .= $info[0][$i];
    $j = ord($info[0][$i]) > 127 ? $j + 2 : $j + 1;
    if ($j > $length - 3) {
      return $wordscut . "...";
    }
  }
  return join('', $info[0]);
}
$string = "312哈哈,这个组合很难切割哦";
echo cutstr($string, 10);
/*---------------------------------下面是曾经用过的截取第三个的字符串的------------------------------*/
// $name1 = mysql_result($my_rst,0,"name");
// $name = preg_match("/([1-9][0-9]+)/",$name1,$r);
// $name = $r[0];
// if($name == ""){
// $name=preg_replace('#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,2}'.
// '((?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,1}).*#s',
// '$1',$name1);
// }
/*--------------------------------------------第四种方法(UTF-8)---------------------------------------------*/
function cut_str($sourcestr, $cutlength)
{
  $returnstr = '';
  $i = 0;
  $n = 0;
  $str_length = strlen($sourcestr);//字符串的字节数
  while ($n < $cutlength && $i <= $str_length) {
    $temp_str = substr($sourcestr, $i, 1);
    $ascnum = ord($temp_str);//得到字符串中第$i位字符的ASCII码
    if ($ascnum >= 224) {
      $returnstr = $returnstr . substr($sourcestr, $i, 3);//根据UTF-8编码规范,将3个连续的字符计为单个字符
      $i = $i + 3;//实际Byte记为3
      $n++;//字串长度为1
    } elseif ($ascnum >= 192)//如果ASCII位高于192
    {
      $returnstr = $returnstr . substr($sourcestr, $i, 2);//根据UTF-8编码规范,将2个连续的字符记为单个字符
      $i = $i + 2;//实际Byte记为2
      $n++;//字串长度为1
    } elseif ($ascnum >= 65 && $ascnum <= 90)//如果是大写字母
    {
      $returnstr = $returnstr . substr($sourcestr, $i, 1);
      $i = $i + 1;//byte记为1
      $n++;//但考虑到整体美观,大写字母计成一个高位字符
    } else {
      $returnstr = $returnstr . substr($sourcestr, $i, 1);
      $i = $i + 1;//实际的Byte记为1
      $n = $n + 0.5;//小写字母和半角标点等与半个高位字符宽...
    }
  }
  if ($str_length > $cutlength) {
    $returnstr = $returnstr . "...";//超过长度时在尾处加上省略号
  }
  return $returnstr;
}
/*--------------------第五种方法(UTF-8)---------------------------------------------*/
function FSubstr($title, $start, $len = "", $magic = true)
{
  if ($len == "") $len = strlen($title);
  if ($start != 0) {
    $startv = ord(substr($title, $start, 1));
    if ($startv >= 128) {
      if ($startv < 192) {
        for ($i = $start - 1; $i > 0; $i--) {
          $tempv = ord(substr($title, $i, 1));
          if ($tempv >= 192) break;
        }
        $start = $i;
      }
    }
  }
  if (strlen($title) <= $len) return substr($title, $start, $len);
  $alen = 0;
  $blen = 0;
  $realnum = 0;
  $length = 0;
  for ($i = $start; $i < strlen($title); $i++) {
    $ctype = 0;
    $cstep = 0;
    $cur = substr($title, $i, 1);
    if ($cur == "&") {
      if (substr($title, $i, 4) == "<") {
        $cstep = 4;
        $length += 4;
        $i += 3;
        $realnum++;
        if ($magic) {
          $alen++;
        }
      } elseif (substr($title, $i, 4) == ">") {
        $cstep = 4;
        $length += 4;
        $i += 3;
        $realnum++;
        if ($magic) {
          $alen++;
        }
      } elseif (substr($title, $i, 5) == "&") {
        $cstep = 5;
        $length += 5;
        $i += 4;
        $realnum++;
        if ($magic) {
          $alen++;
        }
      } elseif (substr($title, $i, 6) == """) {
        $cstep = 6;
        $length += 6;
        $i += 5;
        $realnum++;
        if ($magic) {
          $alen++;
        }
      } elseif (preg_match("/&#(\d+);?/i", substr($title, $i), $match)) {
        $cstep = strlen($match[0]);
        $length += strlen($match[0]);
        $i += strlen($match[0]) - 1;
        $realnum++;
        if ($magic) {
          $blen++;
          $ctype = 1;
        }
      }
    } else {
      if (ord($cur) >= 252) {
        $cstep = 6;
        $length += 6;
        $i += 5;
        $realnum++;
        if ($magic) {
          $blen++;
          $ctype = 1;
        }
      } elseif (ord($cur) >= 248) {
        $cstep = 5;
        $length += 5;
        $i += 4;
        $realnum++;
        if ($magic) {
          $ctype = 1;
          $blen++;
        }
      } elseif (ord($cur) >= 240) {
        $cstep = 4;
        $length += 4;
        $i += 3;
        $realnum++;
        if ($magic) {
          $blen++;
          $ctype = 1;
        }
      } elseif (ord($cur) >= 224) {
        $cstep = 3;
        $length += 3;
        $i += 2;
        $realnum++;
        if ($magic) {
          $ctype = 1;
          $blen++;
        }
      } elseif (ord($cur) >= 192) {
        $ctype = 2;
        $length += 2;
        $i += 1;
        $realnum++;
        if ($magic) {
          $blen++;
          $ctype = 1;
        }
      } elseif (ord($cur) >= 128) {
        $length += 1;
      } else {
        $cstep = 1;
        $length += 1;
        $realnum++;
        if ($magic) {
          if (ord($cur) >= 65 && ord($cur) <= 90) {
            $blen++;
          } else {
            $alen++;
          }
        }
      }
    }
    if ($magic) {
      if (($blen * 2 + $alen) == ($len * 2)) break;
      if (($blen * 2 + $alen) == ($len * 2) + 1) {
        if ($ctype == 1) {
          $length -= $cstep;
          break;
        } else {
          break;
        }
      }
    } else {
      if ($realnum == $len) break;
    }
  }
  unset($cur);
  unset($alen);
  unset($blen);
  unset($realnum);
  unset($ctype);
  unset($cstep);
  return substr($title, $start, $length);
}
function utf8Substr($str, $from, $len)
{
  return preg_replace('#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,' . $from . '}' .
    '((?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,' . $len . '}).*#s',
    '$1', $str);
}
$title = "你哈珀niad1纳斯达wop asdni你爱谁都没阿斯顿撒旦12ccs- sd";
$title = utf8Substr($title, 0, 15);
echo $title;
?>

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
linux下删除7天前日志的代码(php+shell)
Jan 02 PHP
php切割页面div内容的实现代码分享
Jul 31 PHP
判断php数组是否为索引数组的实现方法
Jun 13 PHP
PHP统计nginx访问日志中的搜索引擎抓取404链接页面路径
Jun 30 PHP
PHP使用GIFEncoder类生成的GIF动态图片验证码
Jul 01 PHP
PHP对象相互引用的内存溢出实例分析
Aug 28 PHP
PHP中exec与system用法区别分析
Sep 22 PHP
php使用explode()函数将字符串拆分成数组的方法
Feb 17 PHP
PHP下载远程文件到本地存储的方法
Mar 24 PHP
PHP模板解析类实例
Jul 09 PHP
Redis在Laravel项目中的应用实例详解
Aug 11 PHP
yii框架redis结合php实现秒杀效果(实例代码)
Oct 26 PHP
YII框架常用技巧总结
Apr 27 #PHP
YII框架行为behaviors用法示例
Apr 26 #PHP
YII框架模块化处理操作示例
Apr 26 #PHP
Yii框架ACF(accessController)简单权限控制操作示例
Apr 26 #PHP
YII框架实现自定义第三方扩展操作示例
Apr 26 #PHP
PHP中PCRE正则解析代码详解
Apr 26 #PHP
通过PHP设置BugFree获取邮箱通知
Apr 25 #PHP
You might like
PHP中使用SimpleXML检查XML文件结构实例
2015/01/07 PHP
PHP使用递归按层级查找数据的方法
2019/11/10 PHP
FireFox中textNode分片的问题
2007/04/10 Javascript
(function($){...})(jQuery)的意思
2010/07/22 Javascript
Javascript学习笔记二 之 变量
2010/12/15 Javascript
jquery操作复选框(checkbox)的12个小技巧总结
2014/02/04 Javascript
jQuery+html5+css3实现圆角无刷新表单带输入验证功能代码
2015/08/21 Javascript
JS实现样式清新的横排下拉菜单效果
2015/10/09 Javascript
JavaScript驾驭网页-DOM
2016/03/24 Javascript
第三篇Bootstrap网格基础
2016/06/21 Javascript
详解有关easyUI的拖动操作中droppable,draggable用法例子
2017/06/03 Javascript
nodejs mysql 实现分页的方法
2017/06/06 NodeJs
AngularJs用户登录问题处理(交互及验证、阻止FQ处理)
2017/10/26 Javascript
微信公众号H5支付接口调用方法
2019/01/10 Javascript
jQuery实现的导航条点击后高亮显示功能示例
2019/03/04 jQuery
layui 实现表格某一列显示图标
2019/09/19 Javascript
js实现抽奖功能
2020/11/24 Javascript
python实现系统状态监测和故障转移实例方法
2013/11/18 Python
Python使用openpyxl读写excel文件的方法
2017/06/30 Python
python 提取key 为中文的json 串方法
2018/12/31 Python
Django如何简单快速实现PUT、DELETE方法
2019/07/24 Python
pytorch 彩色图像转灰度图像实例
2020/01/13 Python
详解pandas中iloc, loc和ix的区别和联系
2020/03/09 Python
Java byte数组操纵方式代码实例解析
2020/07/22 Python
分享unittest单元测试框架中几种常用的用例加载方法
2020/12/02 Python
Alba Moda德国网上商店:意大利时尚女装销售
2016/11/14 全球购物
联想瑞士官方网站:Lenovo Switzerland
2017/11/19 全球购物
Bogner美国官网:滑雪服中的”Dior”
2018/01/30 全球购物
Gloeilampgoedkoop荷兰:在线购买灯泡
2019/02/16 全球购物
焊接专业毕业生求职信
2013/10/01 职场文书
放飞蜻蜓反思
2014/02/05 职场文书
优秀团员事迹材料1000字
2014/08/20 职场文书
财务管理制度范本
2015/08/04 职场文书
redis实现的四种常见限流策略
2021/06/18 Redis
Python经常使用的一些内置函数
2022/04/11 Python
Hive HQL支持2种查询语句风格
2022/06/25 数据库