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 相关文章推荐
PHP5.0正式发布 不完全兼容PHP4 新增多项功能
Oct 09 PHP
PHP定时执行计划任务的多种方法小结
Dec 19 PHP
编写Smarty插件在模板中直接加载数据的详细介绍
Jun 26 PHP
配置php网页显示各种语法错误
Sep 23 PHP
PHP字符串的连接的简单实例
Dec 30 PHP
PHP中new static()与new self()的区别异同分析
Aug 22 PHP
ThinkPHP文件缓存类代码分享
Apr 22 PHP
PHP使用MPDF类生成PDF的方法
Dec 08 PHP
人脸识别测颜值、测脸龄、测相似度微信接口
Apr 07 PHP
Yii列表定义与使用分页方法小结(3种方法)
Jul 15 PHP
PHP从数组中删除元素的四种方法实例
May 12 PHP
PHP删除字符串中非字母数字字符方法总结
Jan 20 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
基于MySQL到MongoDB简易对照表的详解
2013/06/03 PHP
PHP使用Face++接口开发微信公众平台人脸识别系统的方法
2015/04/17 PHP
php实现的简易扫雷游戏实例
2015/07/09 PHP
如何用javascript判断录入的日期是否合法
2007/01/08 Javascript
麦鸡的TAB切换功能结合了javascript和css
2007/12/17 Javascript
基于jQuery的表格操作插件
2010/04/22 Javascript
Prototype源码浅析 Enumerable部分之each方法
2012/01/16 Javascript
javascipt基础内容--需要注意的细节
2013/04/10 Javascript
JQUERY对单选框(radio)操作的小例子
2013/04/25 Javascript
js获取url中&quot;?&quot;后面的字串方法
2014/05/15 Javascript
jQuery增加、删除及修改select option的方法
2016/08/19 Javascript
再谈javascript常见错误及解决方法
2016/09/16 Javascript
Javascript 高性能之递归,迭代,查表法详解及实例
2017/01/08 Javascript
jQuery查找dom的几种方法效率详解
2017/05/17 jQuery
快速了解vue-cli 3.0 新特性
2018/02/28 Javascript
ES6基础之解构赋值(destructuring assignment)
2019/02/21 Javascript
原生JS实现汇率转换功能代码实例
2020/05/13 Javascript
用Python制作检测Linux运行信息的工具的教程
2015/04/01 Python
使用Python的PIL模块来进行图片对比
2016/02/18 Python
详解Appium+Python之生成html测试报告
2019/01/04 Python
复化梯形求积分实例——用Python进行数值计算
2019/11/20 Python
python3爬取torrent种子链接实例
2020/01/16 Python
python 计算方位角实例(根据两点的坐标计算)
2020/01/17 Python
python3 sorted 如何实现自定义排序标准
2020/03/12 Python
浅谈tensorflow使用张量时的一些注意点tf.concat,tf.reshape,tf.stack
2020/06/23 Python
Python自动化操作实现图例绘制
2020/07/09 Python
Django中和时区相关的安全问题详解
2020/10/12 Python
如何用Python 实现全连接神经网络(Multi-layer Perceptron)
2020/10/15 Python
Html5新增标签与样式及让元素水平垂直居中
2019/07/11 HTML / CSS
JackJones官方旗舰店:杰克琼斯男装
2018/03/27 全球购物
静态成员和非静态成员的区别
2012/05/12 面试题
医药代表个人求职信范本
2013/12/19 职场文书
党员批评与自我批评
2014/02/12 职场文书
民事辩护词范文
2015/05/21 职场文书
文明和谐家庭事迹材料(2016精选版)
2016/02/29 职场文书
Apache Hudi集成Spark SQL操作hide表
2022/03/31 Servers