版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xuyawei_xyw/article/details/81225998
字符串截取有时候会涉及到编码的问题,自己写的如果不完善很容易出现截取出现乱码的问题,这样的函数功能块通常会用在截取文章描述和标题的时候。
在实际的编写代码过程中,不免要用到截取字符串,比如在商品模块里,商品的描述过程,而在前台完全展示,会让界面显得臃肿难看,这时就需要截取字符串,展示前几个字段信息。字符串截取有时候会涉及到编码的问题,自己写的如果不完善很容易出现截取出现乱码的问题。对这个问题,参照着前辈们的经验,两种方法(第二种方法是参考的)实现的比较函数,下一个函数是上一个的函数的多条件处理。
<?php
//定义一个字符串
$titles = "请由我引吭高歌,面迎啊海上风";
$title_subtext = subtext($titles,6);
if($title_subtext){
echo "subtext()函数截取的字符串: ".$title_subtext;
}
$title = cut_str($titles,6);
if($title){
echo "<br>cut_str()函数截取的字符串: ".$title;
}
//字符串截取,cut_str函数(一)
function subtext($sourcestr, $cutlength)
{
if(mb_strlen($sourcestr, 'utf-8') > $cutlength){
//字符串截取并且超出显示省略号
return mb_substr($sourcestr,0,$cutlength,'utf-8')."......";
}
return $sourcestr;
}
//字符串截取,cut_str函数(二)
function cut_str($sourcestr,$cutlength)
{
//先定义一个空字符串
$returnstr = '';
//初始字节
$i = 0;
$n = 0;
//字符串的字节数 ,中文在utf-8编码是3个字节,strlen()计算字节数
$str_length = strlen($sourcestr);
while (($n < $cutlength) and ($i <= $str_length))
{
//substr()函数截取字符串,从$i开始长度为1个
$temp_str = substr($sourcestr,$i,1);
//得到字符串中第$i位字符的ascii码,ord()函数返回字符串的首个字符的 ASCII 值
$ascnum = ord($temp_str);
//如果ASCII位高与224
if ($ascnum >= 224)
{
//根据UTF-8编码规范,将3个连续的字符计为单个字符
$returnstr = $returnstr.substr($sourcestr,$i,3);
$i = $i + 3;
//字串长度计1
$n++ ;
//如果ASCII位高与192
}elseif ($ascnum >= 192){
//根据UTF-8编码规范,将2个连续的字符计为单个字符
$returnstr = $returnstr.substr($sourcestr,$i,2);
$i = $i + 2;
//字串长度计1
$n++ ;
//如果是大写字母
}elseif ($ascnum >= 65 && $ascnum <= 90){
$returnstr = $returnstr.substr($sourcestr,$i,1);
$i = $i + 1;
$n++ ;
//其他情况下,比如小写字母
}else {
$returnstr = $returnstr.substr($sourcestr,$i,1);
$i = $i + 1;
$n = $n + 0.5;
}
}
//如果预截取的字符串超过长度时在尾处加上省略号
if ($str_length > $i){
$returnstr = $returnstr . "......";
}
return $returnstr;
}
输出信息:
subtext()函数截取的字符串: 请由我引吭高......
cut_str()函数截取的字符串: 请由我引吭高......