可以保证单词完整性的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 相关文章推荐
比较全的PHP 会话(session 时间设定)使用入门代码
Jun 05 PHP
PHP中isset()和unset()函数的用法小结
Mar 11 PHP
php对关联数组循环遍历的实现方法
Mar 13 PHP
PHP汉字转换拼音的函数代码
Dec 30 PHP
人脸识别测颜值、测脸龄、测相似度微信接口
Apr 07 PHP
浅谈php中的访问修饰符private、protected、public的作用范围
Nov 20 PHP
微信 getAccessToken方法详解及实例
Nov 23 PHP
PHP去除字符串最后一个字符的三种方法实例
Mar 01 PHP
PHPExcel中文帮助手册|PHPExcel使用方法(分享)
Jun 09 PHP
Laravel框架FormRequest中重写错误处理的方法
Feb 18 PHP
PHP+mysql防止SQL注入的方法小结
Apr 27 PHP
laravel 解决后端无法获取到前端Post过来的值问题
Oct 22 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数组的一些常见操作汇总
2011/07/17 PHP
php漏洞之跨网站请求伪造与防止伪造方法
2013/08/15 PHP
PHP实现获取ip地址的5种方法,以及插入用户登录日志操作示例
2019/02/28 PHP
PHP实现长轮询消息实时推送功能代码实例讲解
2021/02/26 PHP
一段非常简单的让图片自动切换js代码
2006/11/10 Javascript
Display SQL Server Version Information
2007/06/21 Javascript
Colortip基于jquery的信息提示框插件在IE6下面的显示问题修正方法
2010/12/06 Javascript
jquery关于图形报表的运用实现代码
2011/01/06 Javascript
JQuery魔力之$(&quot;tagName&quot;)与selector
2012/03/05 Javascript
Javascript中各种trim的实现详细解析
2013/12/10 Javascript
JavaScript闭包函数访问外部变量的方法
2014/08/27 Javascript
js贪吃蛇游戏实现思路和源码
2016/04/14 Javascript
JavaScript记录光标在编辑器中位置的实现方法
2016/04/22 Javascript
html+js实现简单的计算器代码(加减乘除)
2016/07/12 Javascript
Bootstrap基本模板的使用和理解1
2016/12/14 Javascript
ajax异步请求详解
2017/01/06 Javascript
js点击时关闭该范围下拉菜单之外的菜单方法
2018/01/11 Javascript
javascript回调函数详解
2018/02/06 Javascript
JavaScript常用工具方法封装
2019/02/12 Javascript
vue-cli的build的文件夹下没有dev-server.js文件配置mock数据的方法
2019/04/17 Javascript
JS动态图片的实现方法完整示例
2020/01/13 Javascript
python复制与引用用法分析
2015/04/08 Python
Python初学时购物车程序练习实例(推荐)
2017/08/08 Python
详解python 注释、变量、类型
2018/08/10 Python
python后端接收前端回传的文件方法
2019/01/02 Python
在PyCharm中批量查找及替换的方法
2019/01/20 Python
Python 仅获取响应头, 不获取实体的实例
2019/08/21 Python
python之pymysql模块简单应用示例代码
2019/12/16 Python
python json.dumps() json.dump()的区别详解
2020/07/14 Python
科颜氏美国官网:Kiehl’s美国
2017/01/31 全球购物
weblogic面试题
2016/03/07 面试题
承诺书格式范文
2014/06/03 职场文书
机电专业求职信
2014/06/14 职场文书
python实现的web监控系统
2021/04/27 Python
Golang二维数组的使用方式
2021/05/28 Golang
mysql获取指定时间段中所有日期或月份的语句(不设存储过程,不加表)
2021/06/18 MySQL