可以保证单词完整性的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世纪万年历
Dec 06 PHP
php环境配置之CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI比较?
Oct 17 PHP
基于curl数据采集之单页面并行采集函数get_htmls的使用
Apr 28 PHP
浅析linux下apache服务器的配置和管理
Aug 10 PHP
php float不四舍五入截取浮点型字符串方法总结
Oct 28 PHP
php过滤XSS攻击的函数
Nov 12 PHP
php中cookie的使用方法
Mar 29 PHP
golang与PHP输出excel示例
Jul 22 PHP
PHP实现Redis单据锁以及防止并发重复写入
Apr 10 PHP
YII框架http缓存操作示例
Apr 29 PHP
PHP基础之输出缓冲区基本概念、原理分析
Jun 19 PHP
PHP正则之正向预查与反向预查讲解与实例
Apr 06 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过程中的一些注意点的总结
2013/10/25 PHP
PHP观察者模式示例【Laravel框架中有用到】
2018/06/15 PHP
JavaScript几种形式的树结构菜单
2010/05/10 Javascript
javascript smipleChart 简单图标类
2011/01/12 Javascript
从零开始学习jQuery (四) jQuery中操作元素的属性与样式
2011/02/23 Javascript
图片在浏览器中底部对齐 解决方法之一
2011/11/30 Javascript
删除节点的jquery代码
2014/01/13 Javascript
JS正则表达式比较常见用法
2016/01/26 Javascript
vue.js路由跳转详解
2017/08/28 Javascript
浅谈Webpack打包优化技巧
2018/06/12 Javascript
原生JS实现的简单轮播图功能【适合新手】
2018/08/17 Javascript
微信小程序首页的分类功能和搜索功能的实现思路及代码详解
2018/09/11 Javascript
初学node.js中实现删除用户路由
2019/05/27 Javascript
浅析vue-router实现原理及两种模式
2020/02/11 Javascript
关于IDEA中的.VUE文件报错 Export declarations are not supported by current JavaScript version
2020/10/17 Javascript
Django与遗留的数据库整合的方法指南
2015/07/24 Python
用 Python 连接 MySQL 的几种方式详解
2018/04/04 Python
python创建文件备份的脚本
2018/09/11 Python
用pyqt5 给按钮设置图标和css样式的方法
2019/06/24 Python
详解python和matlab的优势与区别
2019/06/28 Python
Python日志:自定义输出字段 json格式输出方式
2020/04/27 Python
Python类绑定方法及非绑定方法实例解析
2020/10/09 Python
Python包资源下载路径报404解决方案
2020/11/05 Python
Python读取ini配置文件传参的简单示例
2021/01/05 Python
德国体育用品网上商店:SC24.com
2016/08/01 全球购物
纽约著名的服装辅料来源:M&J Trimming
2017/07/26 全球购物
美国首屈一指的高品质珠宝设计师和零售商:Allurez
2018/01/23 全球购物
美国Randolph太阳镜官网:美国制造的飞行员太阳镜和射击眼镜
2018/06/15 全球购物
英国时尚优质的女装:Hope Fashion
2018/08/14 全球购物
《我的信念》教学反思
2014/02/15 职场文书
产品发布会策划方案
2014/05/12 职场文书
捐款倡议书格式范文
2014/05/14 职场文书
企业法人授权委托书范本
2014/09/23 职场文书
教师先进事迹材料
2014/12/16 职场文书
关于MySQL临时表为什么可以重名的问题
2022/03/22 MySQL
英国数字版游戏销量周榜公布 《小缇娜的奇幻之地》登顶
2022/04/03 其他游戏