可以保证单词完整性的PHP英文字符串截取代码分享
直接上代码:
/** *完整词的截取 * *@param$str *@param$start *@param$length * *@returnstring */ publicstaticfunctionusubstr($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; }