可以保证单词完整性的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 根据IP地址控制访问的代码
Apr 22 PHP
php中数组首字符过滤功能代码
Jul 31 PHP
深入php多态的实现详解
Jun 09 PHP
解析PHP对现有搜索引擎的调用
Jun 25 PHP
PHP分页效率终结版(推荐)
Jul 01 PHP
解决CodeIgniter伪静态失效
Jun 09 PHP
WordPress中用于获取文章信息以及分类链接的函数用法
Dec 18 PHP
PHP连接MYSQL数据库实例代码
Jan 20 PHP
php 计算两个时间相差的天数、小时数、分钟数、秒数详解及实例代码
Nov 09 PHP
Yii输入正确验证码却验证失败的解决方法
Jun 06 PHP
php下载远程大文件(获取远程文件大小)的实例
Jun 17 PHP
PHP有序表查找之插值查找算法示例
Feb 10 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
7个超级实用的PHP代码片段
2011/07/11 PHP
PHP基础学习之流程控制的实现分析
2013/04/28 PHP
基于simple_html_dom的使用小结
2013/07/01 PHP
在Laravel5中正确设置文件权限的方法
2019/05/22 PHP
40个新鲜出炉的jQuery 插件和免费教程[上]
2012/07/24 Javascript
探讨jQuery的ajax使用场景(c#)
2013/12/03 Javascript
jQuery判断checkbox(复选框)是否被选中以及全选、反选实现代码
2014/02/21 Javascript
动态创建script标签实现跨域资源访问的方法介绍
2014/02/28 Javascript
node.js中的buffer.Buffer.isEncoding方法使用说明
2014/12/14 Javascript
深入理解JavaScript系列(25):设计模式之单例模式详解
2015/03/03 Javascript
JavaScript使用cookie实现记住账号密码功能
2015/04/27 Javascript
Vue.js快速入门教程
2016/09/07 Javascript
nodejs中sleep功能实现暂停几秒的方法
2017/07/12 NodeJs
详解React中setState回调函数
2018/06/14 Javascript
微信小程序如何自定义table组件
2019/06/29 Javascript
[00:32]2016完美“圣”典风云人物:Maybe宣传片
2016/12/05 DOTA
用Python的Flask框架结合MySQL写一个内存监控程序
2015/11/07 Python
python数据预处理之数据标准化的几种处理方式
2019/07/17 Python
Python TCPServer 多线程多客户端通信的实现
2019/12/31 Python
python3使用Pillow、tesseract-ocr与pytesseract模块的图片识别的方法
2020/02/26 Python
5行Python代码实现图像分割的步骤详解
2020/05/25 Python
Python如何爬取51cto数据并存入MySQL
2020/08/25 Python
非常震撼的纯CSS3人物行走动画
2016/02/24 HTML / CSS
localStorage、sessionStorage使用总结
2017/11/17 HTML / CSS
瑞典的玛丽小姐:Miss Mary of Sweden
2019/02/13 全球购物
美国在线轮胎零售商:SimpleTire
2019/04/08 全球购物
凯普林包包西班牙官网:Kipling西班牙
2019/04/12 全球购物
澳大利亚设计的优质鞋类和适合澳大利亚生活方式的服装:Rivers
2019/04/23 全球购物
好邻里事迹材料
2014/01/16 职场文书
2014年前台文员工作总结
2014/12/08 职场文书
防溺水安全教育主题班会
2015/08/12 职场文书
小学班主任研修日志
2015/11/13 职场文书
忠诚教育学习心得体会
2016/01/23 职场文书
中学语文教学反思
2016/02/16 职场文书
python爬不同图片分别保存在不同文件夹中的实现
2021/04/02 Python
MySQL 不等于的三种使用及区别
2021/06/03 MySQL