截取指定长度的字符串

时间:2023-01-12 08:21:07

 

 

/*
* 函数说明:截取指定长度的字符串
* utf-8专用 汉字和大写字母长度算1,其它字符长度算0.5
*
* @param string $str 原字符串
* @param int $len 截取长度
* @param string $etc 省略字符...
* @return string 截取后的字符串
*/
if(!function_exists('ReStrLen'))
{
function ReStrLen($str, $len=10, $etc='...')
{
$restr = '';
$i = 0;
$n = 0.0;

//字符串的字节数
$strlen = strlen($str);
while(($n < $len) and ($i < $strlen))
{
$temp_str = substr($str, $i, 1);

//得到字符串中第$i位字符的ASCII码
$ascnum = ord($temp_str);

//如果ASCII位高与252
if($ascnum >= 252)
{
//根据UTF-8编码规范,将6个连续的字符计为单个字符
$restr = $restr.substr($str, $i, 6);
//实际Byte计为6
$i = $i + 6;
//字串长度计1
$n++;
}
elseif($ascnum >= 248)
{
$restr = $restr.substr($str, $i, 5);
$i = $i + 5;
$n++;
}
elseif($ascnum >= 240)
{
$restr = $restr.substr($str, $i, 4);
$i = $i + 4;
$n++;
}
elseif($ascnum >= 224)
{
$restr = $restr.substr($str, $i, 3);
$i = $i + 3 ;
$n++;
}
elseif ($ascnum >= 192)
{
$restr = $restr.substr($str, $i, 2);
$i = $i + 2;
$n++;
}

//如果是大写字母 I除外
elseif($ascnum>=65 and $ascnum<=90 and $ascnum!=73)
{
$restr = $restr.substr($str, $i, 1);
//实际的Byte数仍计1个
$i = $i + 1;
//但考虑整体美观,大写字母计成一个高位字符
$n++;
}

//%,&,@,m,w 字符按1个字符宽
elseif(!(array_search($ascnum, array(37, 38, 64, 109 ,119)) === FALSE))
{
$restr = $restr.substr($str, $i, 1);
//实际的Byte数仍计1个
$i = $i + 1;
//但考虑整体美观,这些字条计成一个高位字符
$n++;
}

//其他情况下,包括小写字母和半角标点符号
else
{
$restr = $restr.substr($str, $i, 1);
//实际的Byte数计1个
$i = $i + 1;
//其余的小写字母和半角标点等与半个高位字符宽
$n = $n + 0.5;
}
}

//超过长度时在尾处加上省略号
if($i < $strlen)
{
$restr = $restr.$etc;
}

return $restr;
}
}