<?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; } ?>