可以保证单词完整性的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 相关文章推荐
打造计数器DIY三步曲(中)
Oct 09 PHP
通过具体程序来理解PHP里面的抽象类
Jan 28 PHP
解析smarty模板中类似for的功能实现
Jun 18 PHP
PHP上传Excel文件导入数据到MySQL数据库示例
Oct 25 PHP
php版微信返回用户text输入的方法
Nov 14 PHP
Yii框架实现的验证码、登录及退出功能示例
May 20 PHP
PHP实现的自定义图像居中裁剪函数示例【测试可用】
Aug 11 PHP
PDO::errorInfo讲解
Jan 28 PHP
PHP生成指定范围内的N个不重复的随机数
Mar 18 PHP
PHP+swoole+linux实现系统监控和性能优化操作示例
Apr 15 PHP
laravel excel 上传文件保存到本地服务器功能
Nov 14 PHP
PhpStorm 如何优雅的调试Hyperf的方法步骤
Nov 24 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
thinkPHP多语言切换设置方法详解
2016/11/11 PHP
实例讲解PHP页面静态化
2018/02/05 PHP
PHP钩子实现方法解析
2019/05/21 PHP
Prototype使用指南之hash.js
2007/01/10 Javascript
Javascript图像处理思路及实现代码
2012/12/25 Javascript
对于this和$(this)的个人理解
2013/09/08 Javascript
javascript使用window.open提示“已经计划系统关机”的原因
2014/08/15 Javascript
jQuery中children()方法用法实例
2015/01/07 Javascript
JS封装的自动创建表格的实现代码
2016/06/15 Javascript
jQuery 选择器(61种)整理总结
2016/09/26 Javascript
js将table的每个td的内容自动赋值给其title属性的方法
2016/10/13 Javascript
js实现页面刷新滚动条位置不变
2016/11/27 Javascript
详解前端构建工具gulpjs的使用介绍及技巧
2017/01/19 Javascript
JS跨域请求外部服务器的资源
2017/02/06 Javascript
thinkphp标签实现bootsrtap轮播carousel实例代码
2017/02/19 Javascript
Linux CentOS系统下安装node.js与express的方法
2017/04/01 Javascript
关于vue-router的beforeEach无限循环的问题解决
2017/09/09 Javascript
javaScript实现滚动条事件详解
2020/03/24 Javascript
详解通过源码解析Node.js中cluster模块的主要功能实现
2018/05/16 Javascript
利用Vconsole和Fillder进行移动端抓包调试方法
2019/03/05 Javascript
JS forEach跳出循环2种实现方法
2020/06/24 Javascript
json.stringify()与json.parse()的区别以及用处
2021/01/25 Javascript
Python中你应该知道的一些内置函数
2017/03/31 Python
python 输出上个月的月末日期实例
2018/04/11 Python
Python 3.x 判断 dict 是否包含某键值的实例讲解
2018/07/06 Python
Python2和Python3的共存和切换使用
2019/04/12 Python
详解Python 多线程 Timer定时器/延迟执行、Event事件
2019/06/27 Python
PyTorch预训练的实现
2019/09/18 Python
在pycharm中为项目导入anacodna环境的操作方法
2020/02/12 Python
opencv之颜色过滤只留下图片中的红色区域操作
2020/06/05 Python
英国安全产品购物网站:The Safe Shop
2017/03/20 全球购物
Camper鞋西班牙官方网上商店:西班牙马略卡岛的鞋类品牌
2019/03/14 全球购物
幼儿园教师岗位职责
2014/03/17 职场文书
法定代表人身份证明书
2014/09/10 职场文书
2015年个人剖析材料范文
2014/12/29 职场文书
酒店辞职书怎么写
2015/02/26 职场文书