可以保证单词完整性的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 动态添加记录
Mar 10 PHP
用PHP获取Google AJAX Search API 数据的代码
Mar 12 PHP
PHP中几个常用的魔术常量
Feb 23 PHP
探讨方法的重写(覆载)详解
Jun 08 PHP
PHP 解决session死锁的方法
Jun 20 PHP
zf框架的registry(注册表)使用示例
Mar 13 PHP
Linux下PHP连接Oracle数据库
Aug 20 PHP
php 使用array函数实现分页
Feb 13 PHP
php中__toString()方法用法示例
Dec 07 PHP
laravel框架模板之公共模板、继承、包含实现方法分析
Aug 30 PHP
浅谈PHP array_search 和 in_array 函数效率问题
Oct 15 PHP
基于PHP的微信公众号的开发流程详解
Aug 07 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 动态生成静态HTML页面示例代码
2014/01/15 PHP
php生成图片缩略图的方法
2015/04/07 PHP
Zend Framework教程之Zend_Helpers动作助手ViewRenderer用法详解
2016/07/20 PHP
总结PHP中DateTime的常用方法
2016/08/11 PHP
Laravel实现搜索的时候分页并携带参数
2019/10/15 PHP
laravel unique验证、确认密码confirmed验证以及密码修改验证的方法
2019/10/16 PHP
Display SQL Server Login Mode
2007/06/21 Javascript
JavaScript DOM 添加事件
2009/02/14 Javascript
js中for in的用法示例解析
2013/12/25 Javascript
jQuery+CSS3实现树叶飘落特效
2015/02/01 Javascript
XML文件转化成NSData对象的方法
2015/08/12 Javascript
js+css简单实现网页换肤效果
2015/12/29 Javascript
web 前端常用组件之Layer弹出层组件
2016/09/22 Javascript
微信小程序 视图层(xx.xml)和逻辑层(xx.js)详细介绍
2016/10/13 Javascript
Bootstrap源码学习笔记之bootstrap进度条
2016/12/24 Javascript
jQuery复合事件结合toggle()方法的用法示例
2017/06/10 jQuery
详解使用angularjs的ng-options时如何设置默认值(初始值)
2017/07/18 Javascript
Angularjs之如何在跨域请求中传输Cookie的方法
2018/06/01 Javascript
微信小程序实现城市列表选择
2018/06/05 Javascript
JS/CSS实现字符串单词首字母大写功能
2019/09/03 Javascript
Vue组件基础用法详解
2020/02/05 Javascript
Vue实现手机计算器
2020/08/17 Javascript
运用Python的webbrowser实现定时打开特定网页
2019/02/21 Python
Python读取stdin方法实例
2019/05/24 Python
Django 响应数据response的返回源码详解
2019/08/06 Python
Pycharm 2020最新永久激活码(附最新激活码和插件)
2020/09/17 Python
Python发起请求提示UnicodeEncodeError错误代码解决方法
2020/04/21 Python
结束运行python的方法
2020/06/16 Python
Python函数__new__及__init__作用及区别解析
2020/08/31 Python
css3的transition效果和transfor效果示例介绍
2013/10/30 HTML / CSS
Omio荷兰:预订火车、巴士和机票
2018/11/04 全球购物
领导干部廉政自律承诺书
2014/05/26 职场文书
计生专干事迹
2014/05/28 职场文书
MySQL之高可用集群部署及故障切换实现
2021/04/22 MySQL
Mysql数据库按时间点恢复实战记录
2021/06/30 MySQL
pytest实现多进程与多线程运行超好用的插件
2022/07/15 Python