字符串截取(汉字,字母,数字在浏览器所占像素不同,保证截取的字符串所占像素一致)

描述:有一个需求:制作海报,文字需要根据底图宽度截取固定长度的字符串,并且居中,目前这篇文章所讲的截取部分,剧中部分:(底图宽度- 字符宽度)/2 取整就可以了,可以参考我的相关文章

  1. PHP GD库生成缩略图并保存在指定文件夹

  1. PHP GD库生成海报(近期推出

效果图:

字符串截取(汉字,字母,数字在浏览器所占像素不同,保证截取的字符串所占像素一致)_第1张图片

//拆分字符串

public function split(){

$str = '测试测试test12TEST数据12test';

//标准长度

$withmark =200;

//分段,转换成数组,然后变成凑满数据

$strlen = strlen($str);

$strmark = array();

for ($i=0;$i<$strlen;$i++){

if(mb_substr($str,$i,1)){

$strmark[$i] = mb_substr($str,$i,1);

}

}

//设置为空

$strlenmar = 0;

$strlenarray = array();

foreach ($strmark as $key=>$value){

$strlenmar += $this->count_leng($value);

if($strlenmar >= $withmark){

$strlenarray[]=$key;

$strlenmar = 0;

}

}

//总个数(段数)

$allnum = intval(ceil(($this->count_leng($str))/$withmark));

//组装数据

$strlastarray = array();

foreach ($strlenarray as $key=>$value){

$length = $strlenarray[0];

//兼容截取

if(!$strlenarray[$key-1]){

$strlastarray[] = mb_substr($str,0,$length);

}else{

$strlastarray[] = mb_substr($str,$strlenarray[$key-1],$length);

}

}

//兼容截取

if(count($strlastarray) < $allnum){

$strlastarraymore = mb_substr($str,$strlenarray[count($strlastarray)-1],$strlenarray[0]);

}

//获取最终数组

if($strlastarraymore){

$last = array_merge($strlastarray,array($strlastarraymore));

}else{

$last = $strlastarray;

}

var_dump($last);die;

}

public function count_leng($str){

//文字宽度

$spacingsix = 26;

//数据获取(兼容)

preg_match_all("/[0-9]{1}/",$str,$arrNum);//数字个数

preg_match_all("/[a-zA-Z]{1}/",$str,$arrAl);//字母个数

preg_match_all("/([\x{4e00}-\x{9fa5}]){1}/u",$str,$arrCh);//中文个数

$other = mb_strlen($str)-count($arrNum[0])-count($arrAl[0])-count($arrCh[0]);

$distance = count($arrNum[0])*($spacingsix*0.5) + count($arrAl[0])* ($spacingsix* 0.7) +$other*($spacingsix* 0.42) + count($arrCh[0])*$spacingsix;

return $distance;

}

你可能感兴趣的:(开发语言,后端,php,均值算法)