可以保证单词完整性的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将数据导入到Foxmail
Oct 09 PHP
php中数组首字符过滤功能代码
Jul 31 PHP
PHP生成唯一的促销/优惠/折扣码(附源码)
Dec 28 PHP
php生成二维码的几种方式整理及使用实例
Jun 03 PHP
PHP fastcgi模式上传大文件(大约有300多K)报错
Sep 28 PHP
php+html5使用FormData对象提交表单及上传图片的方法
Feb 11 PHP
JSON用法之将PHP数组转JS数组,JS如何接收PHP数组
Oct 08 PHP
利用Fix Rss Feeds插件修复WordPress的Feed显示错误
Dec 19 PHP
Symfony2使用Doctrine进行数据库查询方法实例总结
Mar 18 PHP
yii2.0整合阿里云oss的示例代码
Sep 19 PHP
php在windows环境下获得cpu内存实时使用率(推荐)
Feb 08 PHP
PHP实现的curl批量请求操作示例
Jun 06 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&amp;MYSQL留言板源码
2020/07/19 PHP
PHP中使用foreach和引用导致程序BUG的问题介绍
2012/09/05 PHP
linux使用crontab实现PHP执行计划定时任务
2014/05/10 PHP
php实现微信发红包
2015/12/05 PHP
7个Javascript地图脚本整理
2009/10/20 Javascript
IE的fireEvent方法概述及应用
2013/02/22 Javascript
jquery的ajax请求全面了解
2013/03/20 Javascript
jquery事件与函数的使用介绍
2013/09/29 Javascript
JS对话框_JS模态对话框showModalDialog用法总结
2014/01/11 Javascript
jQuery中attr()和prop()在修改checked属性时的区别
2014/07/18 Javascript
jquery中attr和prop的区别分析
2015/03/16 Javascript
jQuery插件boxScroll实现图片轮播特效
2015/07/14 Javascript
AngularJS实现表单手动验证和表单自动验证
2015/12/09 Javascript
js实现抽奖效果
2017/03/27 Javascript
jQuery实现动态生成表格并为行绑定单击变色动作的方法
2017/04/17 jQuery
微信小程序使用request网络请求操作实例
2017/12/15 Javascript
在Vue中获取组件声明时的name属性方法
2018/09/12 Javascript
jQuery实现checkbox全选、反选及删除等操作的方法详解
2019/08/02 jQuery
Vue封装Axios请求和拦截器的步骤
2020/09/16 Javascript
微信小程序实现选项卡滑动切换
2020/10/22 Javascript
使用vant的地域控件追加全部选项
2020/11/03 Javascript
python编程开发之类型转换convert实例分析
2015/11/13 Python
Python简单计算给定某一年的某一天是星期几示例
2018/06/27 Python
解决vscode python print 输出窗口中文乱码的问题
2018/12/03 Python
python 运用Django 开发后台接口的实例
2018/12/11 Python
python f-string式格式化听语音流程讲解
2019/06/18 Python
django框架模板中定义变量(set variable in django template)的方法分析
2019/06/24 Python
解决安装pyqt5之后无法打开spyder的问题
2019/12/13 Python
python实现npy格式文件转换为txt文件操作
2020/07/01 Python
深入理解HTML的FormData对象
2016/05/17 HTML / CSS
html5录音功能实战示例
2019/03/25 HTML / CSS
面试后感谢信怎么写
2014/02/01 职场文书
2015年爱国卫生工作总结
2015/04/22 职场文书
诚信教育主题班会
2015/08/13 职场文书
浅析Python实现DFA算法
2021/06/26 Python
零基础学java之带参数以及返回值的方法
2022/04/10 Java/Android