可以保证单词完整性的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和MySQL保存和输出图片
Oct 09 PHP
php trim 去除空字符的定义与语法介绍
May 31 PHP
javascript 小型动画组件与实现代码
Jun 02 PHP
如何修改和添加Apache的默认站点目录
Jul 05 PHP
php递归函数三种实现方法及如何实现数字累加
Aug 07 PHP
CI分页类首页、尾页不显示的解决方法
Mar 28 PHP
php使用正则表达式获取字符串中的URL
Dec 29 PHP
Yii框架扩展CGridView增加导出CSV功能的方法
May 24 PHP
PHP实现的mongoDB数据库操作类完整实例
Apr 10 PHP
php查询内存信息操作示例
May 09 PHP
PHP进阶学习之Geo的地图定位算法详解
Jun 19 PHP
TP3.2.3框架使用CKeditor编辑器在页面中上传图片的方法分析
Dec 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
php数组去重的函数代码
2013/02/03 PHP
使用PHP curl模拟浏览器抓取网站信息
2013/10/28 PHP
注释PHP和html混合代码的小技巧(分享)
2016/11/03 PHP
php 如何禁用eval() 函数实例详解
2016/12/01 PHP
jQuery-Easyui 1.2 实现多层菜单效果的代码
2012/01/13 Javascript
YUI模块开发原理详解
2013/11/18 Javascript
JavaScript极简入门教程(二):对象和函数
2014/10/25 Javascript
jQuery Ajax调用WCF服务详细教程
2015/03/31 Javascript
基于JS分页控件实现简单美观仿淘宝分页按钮效果
2016/11/07 Javascript
Angular.js去除页面中显示的空行方法示例
2017/03/30 Javascript
一个有意思的鼠标点击文字特效jquery代码
2017/09/23 jQuery
基于BootStrap的文本编辑器组件Summernote
2017/10/27 Javascript
微信小程序实现留言功能
2018/10/31 Javascript
vue请求本地自己编写的json文件的方法
2019/04/25 Javascript
JS学习笔记之数组去重实现方法小结
2019/05/29 Javascript
vue实现简单瀑布流布局
2020/05/28 Javascript
js实现简单的贪吃蛇游戏
2020/04/23 Javascript
基于aotu.js实现微信自动添加通讯录中的联系人功能
2020/05/28 Javascript
基于vue 动态菜单 刷新空白问题的解决
2020/08/06 Javascript
[02:23]1个至宝=115个英雄特效 最“绿”至宝拉比克“魔导师密钥”登场
2018/12/29 DOTA
python实现通过shelve修改对象实例
2014/09/26 Python
跟老齐学Python之通过Python连接数据库
2014/10/28 Python
用Python的Django框架编写从Google Adsense中获得报表的应用
2015/04/17 Python
Flask框架WTForm表单用法示例
2018/07/20 Python
Python爬虫基础之XPath语法与lxml库的用法详解
2018/09/13 Python
基于python进行抽样分布描述及实践详解
2019/09/02 Python
python实现数字炸弹游戏程序
2020/07/17 Python
python3字符串输出常见面试题总结
2020/12/01 Python
伦敦一家西班牙童装精品店:La Coqueta
2018/02/02 全球购物
大学军训感言200字
2014/02/26 职场文书
财务总监管理岗位职责
2014/03/08 职场文书
教师见习期自我鉴定
2014/04/28 职场文书
数控机床专业自荐信
2014/05/19 职场文书
劳动仲裁撤诉申请书
2015/05/18 职场文书
演讲比赛通讯稿
2015/07/18 职场文书
MIME类型中application/xml与text/xml的区别介绍
2022/01/18 HTML / CSS