可以保证单词完整性的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中的时间显示
Jan 18 PHP
php中目录,文件操作详谈
Mar 19 PHP
PHP MYSQL乱码问题,使用SET NAMES utf8校正
Nov 30 PHP
解析isset与is_null的区别
Aug 09 PHP
php获取从百度搜索进入网站的关键词的详细代码
Jan 08 PHP
php读取csv数据保存到数组的方法
Jan 03 PHP
Thinkphp和onethink实现微信支付插件
Apr 13 PHP
thinkphp框架实现删除和批量删除
Jun 29 PHP
PHP构造函数与析构函数用法示例
Sep 28 PHP
thinkPHP5.0框架引入Traits功能实例分析
Mar 18 PHP
PHP守护进程化在C和PHP环境下的实现
Nov 21 PHP
PHP基于双向链表与排序操作实现的会员排名功能示例
Dec 26 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生成EAN_13标准条形码实例
2013/11/13 PHP
yii2项目实战之restful api授权验证详解
2017/05/20 PHP
一个判断email合法性的函数[非正则]
2008/12/09 Javascript
跨域表单提交状态的变相判断代码
2009/11/12 Javascript
jquery nth-child()选择器的简单应用
2010/07/10 Javascript
JavaScript中的公有、私有、特权和静态成员用法分析
2014/11/20 Javascript
JavaScript中的关联数组问题
2015/03/04 Javascript
png在IE6 下无法透明的解决方法汇总
2015/05/21 Javascript
直接拿来用的15个jQuery代码片段
2015/09/23 Javascript
jQuery中的通配符选择器使用总结
2016/05/30 Javascript
vue.js学习笔记:如何加载本地json文件
2017/01/17 Javascript
canvas仿iwatch时钟效果
2017/03/06 Javascript
NodeJS实现微信公众号关注后自动回复功能
2017/05/31 NodeJs
JavaScript基于扩展String实现替换字符串中index处字符的方法
2017/06/13 Javascript
使用vue的v-for生成table并给table加上序号的实例代码
2017/10/27 Javascript
Vue精简版风格指南(推荐)
2018/01/30 Javascript
基于vue-ssr的静态网站生成器VuePress 初体验
2018/04/17 Javascript
Webpack path与publicPath的区别详解
2018/05/03 Javascript
js+css实现红包雨效果
2018/07/12 Javascript
layerUI下的绑定事件实例代码
2018/08/17 Javascript
vue 中滚动条始终定位在底部的方法
2018/09/03 Javascript
小程序server请求微信服务器超时的解决方法
2019/05/21 Javascript
[46:49]完美世界DOTA2联赛PWL S3 access vs Rebirth 第二场 12.19
2020/12/24 DOTA
Python计算程序运行时间的方法
2014/12/13 Python
浅谈Python 的枚举 Enum
2017/06/12 Python
Python从Excel中读取日期一列的方法
2018/11/28 Python
python与C、C++混编的四种方式(小结)
2019/07/15 Python
Python 根据日志级别打印不同颜色的日志的方法示例
2019/08/08 Python
win10子系统python开发环境准备及kenlm和nltk的使用教程
2019/10/14 Python
Python应用实现处理excel数据过程解析
2020/06/19 Python
美国护肤咨询及美容产品电商:Askderm
2017/02/24 全球购物
.NET remoting中对象激活的两种方式
2015/06/08 面试题
创伤外科专业推荐信范文
2013/11/19 职场文书
个人能力自我鉴赏
2014/01/25 职场文书
入职担保书范文
2014/05/21 职场文书
2019广播稿怎么写
2019/04/17 职场文书