可以保证单词完整性的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 相关文章推荐
深入了解 register_globals (附register_globals=off 网站打不开的解决方法)
Jun 27 PHP
PHP超级全局变量数组小结
Oct 04 PHP
优化PHP代码技巧的小结
Jun 02 PHP
php抽奖小程序的实现代码
Jun 18 PHP
php源码分析之DZX1.5加密解密函数authcode用法
Jun 17 PHP
PHP实现通过URL提取根域名
Mar 31 PHP
实例分析基于PHP微信网页获取用户信息
Nov 24 PHP
PHP设计模式之适配器模式定义与用法详解
Apr 03 PHP
PHP+Redis链表解决高并发下商品超卖问题(实现原理及步骤)
Aug 03 PHP
php微信小程序解包过程实例详解
Mar 31 PHP
Memcached介绍及php-memcache扩展安装
Apr 01 PHP
微信小程序结合ThinkPHP5授权登陆后获取手机号
Nov 23 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
解析crontab php自动运行的方法
2013/06/24 PHP
PHP PDOStatement::execute讲解
2019/01/31 PHP
一个用javascript写的select支持上下键、首字母筛选以及回车取值的功能
2009/09/09 Javascript
jquery插件推荐浏览器嗅探userAgent
2014/11/09 Javascript
html的DOM中document对象anchors集合用法实例
2015/01/21 Javascript
javascript实现全局匹配并替换的方法
2015/04/27 Javascript
JS对HTML表格进行增删改操作
2016/08/22 Javascript
性能优化之代码优化页面加载速度
2017/03/01 Javascript
为JQuery EasyUI 表单组件增加焦点切换功能的方法
2017/04/13 jQuery
JavaScript实现开关等效果
2017/09/08 Javascript
JS实现登录页密码的显示和隐藏功能
2017/12/06 Javascript
JavaScript代码调试方法实例小结
2019/01/05 Javascript
[51:39]DOTA2-DPC中国联赛 正赛 Magma vs LBZS BO3 第二场 2月7日
2021/03/11 DOTA
[01:10:27]DOTA2-DPC中国联赛正赛 SAG vs XG BO3 第二场 3月5日
2021/03/11 DOTA
Python smallseg分词用法实例分析
2015/05/28 Python
Python信息抽取之乱码解决办法
2017/06/29 Python
matplotlib简介,安装和简单实例代码
2017/12/26 Python
对django xadmin自定义菜单的实例详解
2019/01/03 Python
Python实现钉钉发送报警消息的方法
2019/02/20 Python
Django 对象关系映射(ORM)源码详解
2019/08/06 Python
Python 分发包中添加额外文件的方法
2019/08/16 Python
python迭代器常见用法实例分析
2019/11/22 Python
python 使用shutil复制图片的例子
2019/12/13 Python
解决pyPdf和pyPdf2在合并pdf时出现异常的问题
2020/04/03 Python
Python3.8安装Pygame教程步骤详解
2020/08/14 Python
使用CSS3配合IE滤镜实现渐变和投影的效果
2015/09/06 HTML / CSS
Hoover胡佛官网:美国吸尘器和洗地机品牌
2019/01/09 全球购物
Java如何支持I18N?
2016/10/31 面试题
带薪年假请假条
2014/02/04 职场文书
企业内控岗位的职责
2014/02/07 职场文书
制作部班长职位说明书
2014/02/26 职场文书
模具专业自荐信
2014/05/29 职场文书
上班时间打瞌睡检讨书
2014/09/26 职场文书
部门群众路线教育实践活动对照检查材料思想汇报
2014/10/07 职场文书
使用Springboot实现健身房管理系统
2021/07/01 Java/Android
GTX1660显卡搭配显示器推荐
2022/04/19 数码科技