可以保证单词完整性的PHP英文字符串截取代码分享


Posted in PHP onJuly 15, 2014

直接上代码:

/**
   * 完整词的截取
   *
   * @param $str
   * @param $start
   * @param $length
   *
   * @return string
   */
  public static function usubstr($str, $start, $length = null)
  {
 
    // 先正常截取一遍.
    $res = substr($str, $start, $length);
    $strlen = strlen($str);
 
    /* 接着判断头尾各6字节是否完整(不残缺) */
    // 如果参数start是正数
    if ($start >= 0) {
      // 往前再截取大约6字节
      $next_start = $start + $length; // 初始位置
      $next_len = $next_start + 6 <= $strlen ? 6 : $strlen - $next_start;
      $next_segm = substr($str, $next_start, $next_len);
      // 如果第1字节就不是 完整字符的首字节, 再往后截取大约6字节
      $prev_start = $start - 6 > 0 ? $start - 6 : 0;
      $prev_segm = substr($str, $prev_start, $start - $prev_start);
    } // start是负数
    else {
      // 往前再截取大约6字节
      $next_start = $strlen + $start + $length; // 初始位置
      $next_len = $next_start + 6 <= $strlen ? 6 : $strlen - $next_start;
      $next_segm = substr($str, $next_start, $next_len);
 
      // 如果第1字节就不是 完整字符的首字节, 再往后截取大约6字节.
      $start = $strlen + $start;
      $prev_start = $start - 6 > 0 ? $start - 6 : 0;
      $prev_segm = substr($str, $prev_start, $start - $prev_start);
    }
    // 判断前6字节是否符合utf8规则
    if (preg_match('@^([x80-xBF]{0,5})[xC0-xFD]?@', $next_segm, $bytes)) {
      if (!empty($bytes[1])) {
        $bytes = $bytes[1];
        $res .= $bytes;
      }
    }
    // 判断后6字节是否符合utf8规则
    $ord0 = ord($res[0]);
    if (128 <= $ord0 && 191 >= $ord0) {
      // 往后截取 , 并加在res的前面.
      if (preg_match('@[xC0-xFD][x80-xBF]{0,5}$@', $prev_segm, $bytes)) {
        if (!empty($bytes[0])) {
          $bytes = $bytes[0];
          $res = $bytes . $res;
        }
      }
    }
    if (strlen($res) < $strlen) {
      $res = $res . '...';
    }
    return $res;
  }
PHP 相关文章推荐
图象函数中的中文显示
Oct 09 PHP
phpMyAdmin 安装教程全攻略
Mar 19 PHP
ThinkPHP 连接Oracle数据库的详细教程[全]
Jul 16 PHP
php连接mssql的一些相关经验及注意事项
Feb 05 PHP
深入解析PHP垃圾回收机制对内存泄露的处理
Jun 14 PHP
PHP 冒泡排序 二分查找 顺序查找 二维数组排序算法函数的详解
Jun 25 PHP
Linux中为php配置伪静态
Dec 17 PHP
[原创]php常用字符串输出方法分析(echo,print,printf及sprintf)
Jul 09 PHP
PHP 用session与gd库实现简单验证码生成与验证的类方法
Nov 15 PHP
Zend Framework入门教程之Zend_View组件用法示例
Dec 09 PHP
基于php(Thinkphp)+jquery 实现ajax多选反选不选删除数据功能
Feb 24 PHP
PHP开发api接口安全验证操作实例详解
Mar 26 PHP
PHP魔术引号所带来的安全问题分析
Jul 15 #PHP
PH P5.2至5.5、5.6的新增功能详解
Jul 14 #PHP
PHP文件锁定写入实例解析
Jul 14 #PHP
ThinkPHP惯例配置文件详解
Jul 14 #PHP
2014年10个最佳的PHP图像操作库
Jul 14 #PHP
php中的四舍五入函数代码(floor函数、ceil函数、round与intval)
Jul 14 #PHP
mantis安装、配置和使用中的问题小结
Jul 14 #PHP
You might like
php中strstr、strrchr、substr、stristr四个函数的区别总结
2014/09/22 PHP
PHP数组操作――获取数组最后一个值的方法
2015/04/14 PHP
javascript下function声明一些小结
2007/12/28 Javascript
仿校内登陆框,精美,给那些很厉害但是没有设计天才的程序员
2008/11/24 Javascript
js采用map取到id集合组并且实现点击一行选中一行
2013/12/16 Javascript
iframe窗口高度自适应的又一个巧妙实现思路
2014/04/04 Javascript
IE6 hack for js 集锦
2014/09/23 Javascript
举例简介AngularJS的内部语言环境
2015/06/17 Javascript
关于微信jssdk实现多图片上传的一点心得分享
2016/12/13 Javascript
jQuery实现table中两列CheckBox只能选中一个的示例
2017/09/22 jQuery
vue封装第三方插件并发布到npm的方法
2017/09/25 Javascript
JS中精巧的自动柯里化实现方法
2017/12/12 Javascript
vue实现购物车小案例
2019/09/27 Javascript
浅谈如何优雅处理JavaScript异步错误
2019/11/12 Javascript
Openlayers实现点闪烁扩散效果
2020/09/24 Javascript
[04:29]【TI9采访】OG.N0tail在胜者组决赛后接受采访
2019/08/25 DOTA
举例讲解Python中的Null模式与桥接模式编程
2016/02/02 Python
python实现多线程的两种方式
2016/05/22 Python
Python 实现使用dict 创建二维数据、DataFrame
2018/04/13 Python
Python GUI编程学习笔记之tkinter控件的介绍及基本使用方法详解
2020/03/30 Python
TensorFlow2.X结合OpenCV 实现手势识别功能
2020/04/08 Python
Python ArgumentParse的subparser用法说明
2020/04/20 Python
python Xpath语法的使用
2020/11/26 Python
Python读取pdf表格写入excel的方法
2021/01/22 Python
html特殊符号示例 html特殊字符编码对照表
2014/01/14 HTML / CSS
New Balance法国官方网站:购买鞋子和服装
2019/09/01 全球购物
Yahoo-PHP面试题4
2012/05/05 面试题
酒店管理专业毕业生推荐信
2013/11/10 职场文书
团日活动总结范文
2014/04/25 职场文书
2014年团委工作总结
2014/11/13 职场文书
特岗教师个人总结
2015/02/10 职场文书
2015毕业寄语大全
2015/02/26 职场文书
公司奖励通知
2015/04/21 职场文书
恰同学少年观后感
2015/06/08 职场文书
2016关于学习党章的心得体会
2016/01/15 职场文书
《童年》读后感(三篇)
2019/08/27 职场文书