可以保证单词完整性的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 pack与unpack 摸板字符字符含义
Oct 29 PHP
PHP 采集程序中常用的函数
Dec 09 PHP
php中var_export与var_dump的区别分析
Aug 21 PHP
php中用foreach来操作数组的代码
Jul 17 PHP
php中++i 与 i++ 的区别
Aug 08 PHP
phpexcel导出excel的颜色和网页中的颜色显示不一致
Dec 11 PHP
浅析php中三个等号(===)和两个等号(==)的区别
Aug 06 PHP
关于JSON以及JSON在PHP中的应用技巧
Nov 27 PHP
yii实现创建验证码实例解析
Jul 31 PHP
PHP自定session保存路径及删除、注销与写入的方法
Nov 18 PHP
wamp服务器访问php非常缓慢的解决过程
Jul 01 PHP
PHP有序表查找之二分查找(折半查找)算法示例
Feb 09 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
ezSQL PHP数据库操作类库
2010/05/16 PHP
php empty() 检查一个变量是否为空
2011/11/10 PHP
用JAVASCRIPT如何给&amp;lt;textarea&amp;gt;&amp;lt;/textarea&amp;gt;赋值
2007/04/20 Javascript
jQuery与ExtJS之选择实例分析
2010/08/19 Javascript
js获取及判断键盘按键的方法
2015/12/01 Javascript
JS实现合并两个数组并去除重复项只留一个的方法
2015/12/17 Javascript
react性能优化达到最大化的方法 immutable.js使用的必要性
2017/03/09 Javascript
详解node如何让一个端口同时支持https与http
2017/07/04 Javascript
node+koa2+mysql+bootstrap搭建一个前端论坛
2018/05/06 Javascript
Vue ElementUi同时校验多个表单(巧用new promise)
2018/06/06 Javascript
angular6 利用 ngContentOutlet 实现组件位置交换(重排)
2018/11/02 Javascript
如何用webpack4.0撸单页/多页脚手架 (jquery, react, vue, typescript)
2019/06/18 jQuery
解决Layui中layer报错的问题
2019/09/03 Javascript
JS如何判断对象是否包含某个属性
2020/08/29 Javascript
浅谈pandas中Dataframe的查询方法([], loc, iloc, at, iat, ix)
2018/04/10 Python
运用PyTorch动手搭建一个共享单车预测器
2019/08/06 Python
感知器基础原理及python实现过程详解
2019/09/30 Python
python模块导入的方法
2019/10/24 Python
Python3 全自动更新已安装的模块实现
2020/01/06 Python
python 实现任务管理清单案例
2020/04/25 Python
pycharm 2018 激活码及破解补丁激活方式
2020/09/21 Python
Pytorch1.5.1版本安装的方法步骤
2020/12/31 Python
处理textarea中的换行和空格
2019/12/12 HTML / CSS
巴西手表购物网站:eclock
2019/03/19 全球购物
开发中都用到了那些设计模式?用在什么场合?
2014/08/21 面试题
毕业生找工作推荐信
2013/11/21 职场文书
护士见习期自我鉴定
2014/02/08 职场文书
工艺员岗位职责
2014/02/11 职场文书
食堂采购员岗位职责
2014/03/17 职场文书
学校食堂食品安全责任书
2014/07/28 职场文书
优秀党员自我评价范文
2014/09/15 职场文书
党的群众路线对照检查材料范文
2014/09/24 职场文书
法人单位授权委托书范文
2014/10/06 职场文书
2014年保管员工作总结
2014/11/18 职场文书
收入及婚姻状况证明
2014/11/20 职场文书
爱心捐赠活动简讯
2015/07/20 职场文书