字符串截取(汉字,字母,数字在浏览器所占像素不同,保证截取的字符串所占像素一致)
描述:有一个需求:制作海报,文字需要根据底图宽度截取固定长度的字符串,并且居中,目前这篇文章所讲的截取部分,剧中部分:(底图宽度- 字符宽度)/2 取整就可以了,可以参考我的相关文章
PHP GD库生成缩略图并保存在指定文件夹
PHP GD库生成海报(近期推出)
效果图:
//拆分字符串
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;
}
来源地址:https://blog.csdn.net/masterphp/article/details/128672959
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341