可以保证单词完整性的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连接Oracle for NT 远程数据库
Oct 09 PHP
Look And Say 序列php实现代码
May 22 PHP
PHP中extract()函数的定义和用法
Aug 17 PHP
eAccelerator的安装与使用详解
Jun 13 PHP
php如何解决无法上传大于8M的文件问题
Mar 10 PHP
PHP开发框架kohana3 自定义路由设置示例
Jul 14 PHP
PHP使用json_encode函数时不转义中文的解决方法
Nov 12 PHP
利用php-cli和任务计划实现刷新token功能的方法
May 03 PHP
php实现留言板功能(会话控制)
May 23 PHP
php curl上传、下载、https登陆实现代码
Jul 23 PHP
PHP后期静态绑定实例浅析
Dec 21 PHP
php ActiveMQ的安装与使用方法图文教程
Feb 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
收音机频率指针指示不准确和灵敏度低问题
2021/03/02 无线电
PHP+MYSQL的文章管理系统(一)
2006/10/09 PHP
真正的ZIP文件操作类(php)
2007/07/21 PHP
用PHP为SHOPEX增加日志功能代码
2010/07/02 PHP
PHP不使用递归的无限级分类简单实例
2016/11/05 PHP
javascript之对系统的toFixed()方法的修正
2007/05/08 Javascript
javascript Firefox与IE 替换节点的方法
2010/02/24 Javascript
深入理解JavaScript作用域和作用域链
2011/10/21 Javascript
JavaScript字符串对象replace方法实例(用于字符串替换或正则替换)
2014/10/16 Javascript
js中获取jsp表单中radio类型的值简单实例
2016/08/15 Javascript
AngularJS 视图详解及示例代码
2016/08/17 Javascript
简单实现IONIC购物车功能
2017/01/10 Javascript
使用vue制作FullPage页面滚动效果
2017/08/21 Javascript
微信小程序实现通过js操作wxml的wxss属性示例
2018/12/06 Javascript
react配置antd按需加载的使用
2019/02/11 Javascript
fastadmin中调用js的方法
2019/05/14 Javascript
[12:21]VICI vs TNC (BO3)
2018/06/07 DOTA
[01:38]女王驾到——至宝魔廷新尊技能&特效展示
2020/06/16 DOTA
Python Tkinter简单布局实例教程
2014/09/03 Python
python实现批量解析邮件并下载附件
2018/06/19 Python
python去重,一个由dict组成的list的去重示例
2019/01/21 Python
详解python配置虚拟环境
2019/04/08 Python
解决python3 requests headers参数不能有中文的问题
2019/08/21 Python
python 实现超级玛丽游戏
2020/11/25 Python
python tqdm库的使用
2020/11/30 Python
用python实现一个简单的验证码
2020/12/09 Python
纯CSS实现预加载动画效果
2017/09/06 HTML / CSS
英国男士时尚购物网站:Stuarts London
2017/10/22 全球购物
澳大利亚珠宝商:Shiels
2019/10/06 全球购物
Linux的主要特性
2014/10/06 面试题
LINUX下线程,GDI类的解释
2016/12/14 面试题
2014年十一国庆节活动方案
2014/09/16 职场文书
党员民主生活会个人整改措施材料
2014/09/16 职场文书
党的群众路线教育实践活动心得体会范文
2014/11/05 职场文书
学历证明样本
2015/06/16 职场文书
2015年民兵整组工作总结
2015/07/24 职场文书