等宽等像素截取字符串

<?php
 $string = '  按医嘱给予留置胃管,经双人三种方法确认胃管在胃内,插入长度55cm,予固定通畅,加强防脱管宣教。患者查血常规示白细胞2.5*10*9mol/l,医嘱予重组人人';
 test($string);
 function test($string){
    $x = 1;
    $length = 14;
    $nextCount = 0;
    //utf-8字符截取
    $pos = 0;
    $result = array();
    // var_dump(strpos($string, '患者查血常规示白细胞2.5*10*9mol/l,医嘱予重组人'));exit;
    while ($pos !== FALSE) {
        $start = ($x - 1) * $length+$nextCount;
        $val_arr = mb_space_sub($string, $length, 'utf-8', $start);
        $nextCount += $val_arr['nextCount'];
        $value = $val_arr['str'];

        if(empty($value)){
            $pos = FALSE;
        }else{
            if ($nextCount==0  ) {
                $pos = FALSE;
            }
            $result[($x - 1)] = $value;
        }

        $x++;
    }

    var_dump($result);
}

/**
 * 等宽等像素截取字符串
 * @param  [type]  $str    [需要截取的字符串]
 * @param  [type]  $len    [要截取的长度]
 * @param  string $encode [编码]
 * @param  integer $start [开始位置]
 * @return [type]          [description]
 */
function mb_space_sub($str, $len, $encode = 'utf8', $start = 0)
{
    // $str = '  按医嘱给予留置胃管,经双人三种方法确认胃管在胃内,插入长度55cm,予固定通畅,加强防脱管宣教。';
    if ($encode != 'utf8') {
        $str = mb_convert_encoding($str, 'utf8', $encode);
    }
    $nextCount = 0;
    $osLen = mb_strlen($str);
    if ($osLen <= $len) {
        return array('nextCount'=>$nextCount,'str'=>$str);
    }
    $string = mb_substr($str, $start, $len, 'utf8');
    // $spaceCount = countspace($string);
    $sLen = mb_strlen($string, 'utf8');
    $bLen = strlen($string);
    $sCharCount = (3 * $sLen - $bLen) / 2;

    if ($osLen <= $sCharCount + $len) {
        $arr = preg_split('/(?<!^)(?!$)/u', mb_substr($str, $len, $osLen, 'utf8'));//将中英混合字符串分割成数组(UTF8下有效)
    } else {
        $arr = preg_split('/(?<!^)(?!$)/u', mb_substr($str, $start+$len , $sCharCount, 'utf8'));
    }

    foreach ($arr as $value) {
        if (ord($value) < 128 && ord($value) > 0) {
            $sCharCount = $sCharCount - 1;
        } else {
            $sCharCount = $sCharCount - 2;
        }
        if ($sCharCount < 0) {
            break;
        }
        $nextCount ++;
        $string .= $value;
    }
    return array('nextCount'=>$nextCount,'str'=>$string);
    // return $string;
}
?>

 

转载于:https://www.cnblogs.com/tyrionDaenerys/p/8809368.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值