可以保证单词完整性的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&amp;&amp;mysql)六
Oct 09 PHP
PHP 设计模式之观察者模式介绍
Feb 22 PHP
微信公众号开发之微信公共平台消息回复类实例
Nov 14 PHP
thinkphp实现发送邮件密码找回功能实例
Dec 01 PHP
php禁止某ip或ip地址段访问的方法
Feb 25 PHP
php实现读取内存顺序号
Mar 29 PHP
php实现的简单美国商品税计算函数
Jul 13 PHP
浅谈php+phpStorm+xdebug配置方法
Sep 17 PHP
PHP框架性能测试报告
May 08 PHP
PHP实现简单的模板引擎功能示例
Sep 02 PHP
PHP设计模式之工厂模式定义与用法详解
Apr 03 PHP
php 获取xml接口数据的处理方法
May 31 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
咖啡产品发展的三大浪潮
2021/03/04 咖啡文化
php通过session防url攻击方法
2014/12/10 PHP
多个Laravel项目如何共用migrations详解
2018/09/25 PHP
Jquery下判断Id是否存在的代码
2011/01/06 Javascript
杨氏矩阵查找的JS代码
2013/03/21 Javascript
jquery淡化版banner异步图片文字效果切换图片特效
2014/04/08 Javascript
3种Jquery限制文本框只能输入数字字母的方法
2014/12/03 Javascript
AngularJS基础 ng-mousemove 指令简单示例
2016/08/02 Javascript
B/S(Web)实时通讯解决方案分享
2017/04/06 Javascript
Bootstrap 表单验证formValidation 实现表单动态验证功能
2017/05/17 Javascript
详解React 的几种条件渲染以及选择
2018/10/23 Javascript
Node.js控制台彩色输出的方法与原理实例详解
2019/12/01 Javascript
[02:05]2014DOTA2国际邀请赛 BBC外卡赛赛后总结
2014/07/09 DOTA
[01:14]DOTA2亚洲邀请赛 ShowOpen
2015/02/07 DOTA
python中的列表推导浅析
2014/04/26 Python
Python中基础的socket编程实战攻略
2016/06/01 Python
Python中Iterator迭代器的使用杂谈
2016/06/20 Python
在win和Linux系统中python命令行运行的不同
2016/07/03 Python
Python如何快速上手? 快速掌握一门新语言的方法
2017/11/14 Python
Python如何发布程序的详细教程
2018/10/09 Python
python导包的几种方法(自定义包的生成以及导入详解)
2019/07/15 Python
pytorch三层全连接层实现手写字母识别方式
2020/01/14 Python
Pyinstaller加密打包应用的示例代码
2020/06/11 Python
全球航班旅行搜索网站:Cheapflights
2017/05/19 全球购物
eBay澳大利亚站:eBay.com.au
2018/02/02 全球购物
StubHub希腊:购买体育赛事、音乐会和剧院门票
2019/08/03 全球购物
Etam俄罗斯:法国女士内衣和家居服网上商店
2019/10/30 全球购物
ddl,dml和dcl的含义
2016/05/08 面试题
员工自我鉴定范文
2013/10/06 职场文书
《小小竹排画中游》教学反思
2014/02/26 职场文书
区级文明单位申报材料
2014/05/15 职场文书
计划生育标语
2014/06/23 职场文书
七一党日活动总结
2014/07/08 职场文书
2015年医德医风工作总结
2015/04/02 职场文书
2015秋季开学演讲稿范文
2015/07/16 职场文书
2016年端午节校园广播稿
2015/12/18 职场文书