支持 » 主题 » PHP文章截断函数mb_strimwidth常见用法及乱码解决方法

  • liveme导语
    昨天折腾了一个函数的用法,有细心留意的童鞋会发现网站整齐了点,为什么?侧边栏的最热留言等,还有首页中间的四个栏目输出的文章标题全部变成了只有一行,后面多出的就有省略号表示了。这就是用到了一个php函数:mb_strimwidth,主要用于文章的截断。主要是参考了ZWWoOoOo那里介绍的,传送门:《mb_strimwidth函数的简单应用》。不过我这里介绍的除了zww那里介绍的之外,还提供了一种解决乱码的方案。
    mb_strimwidth参数说明
    mb_strimwidth ( string $str , int $start , int $width [, string $trimmarker [, string $encoding ]] )
    $str //指定字符串
    $start //指定从何处开始截取
    $width //截取文字的宽度
    $trimmarker //超过$width数字后显示的字符串
    例一、限制文章标题文字个数
    如我侧边栏的“Random Posts”和“Recent Posts”,因为侧边栏宽度有限,所以对于长文章标题会出现两行,这样有点影响美观,这时就可以用mb_strimwidth函数来限制文字个数在一行内。
    文章标题的调用函数一般是这样:
    <?php the_title(); ?>
    我主题的侧边栏最多大概显示20个中文,所以可以限制在18个文字内,使用mb_strimwidth函数后变成如下:
    <?php echo mb_strimwidth(get_the_title(), 0, 36,”…”); ?>
    其中 36 代表 18 个双字节文字。
    例二、最新评论的文字个数
    liveme这里的最新评论长度是用css的overflow:hidden属性来隐藏评论长度,使他在一行显示。这是因为liveme这里有表情图片输出,不知为啥表情图片占用的字符数特别多,满足了表情图片的字符数后,评论输出又有几行了。于是干脆用overflow:hidden来控制就可以了。只是后面没有了省略号。如果你网站的评论没有表情输出,或者你不在乎的话,也可以试试用mb_strimwidth函数来截取固定的文字数量。
    最新评论代码中评论内容是:strip_tags($rc_comm->comment_content)
    用mb_strimwidth函数限制文字变成:mb_strimwidth(strip_tags($rc_comm->comment_content), 0, 36,”…”)
    很方便的一个函数,还有其他应用就自己举一反三吧,mb_strimwidth()是php的函数,所以不依赖wp的版本。
    截断函数出现乱码的解决
    有些朋友折腾了之后,发现,不行呀,出现乱码呢!嗯,别急,这不是函数出问题,而是你的空间服务器没有打开mb_string extension服务。解决的方法是用sub_str来实现文字截断:
    1、将以下代码放加入到function.php 文件
    function cut_str($sourcestr,$cutlength)
    {
    $returnstr=”;
    $i=0;
    $n=0;
    $str_length=strlen($sourcestr);//字符串的字节数
    while (($n<$cutlength) and ($i<=$str_length))
    {
    $temp_str=substr($sourcestr,$i,1);
    $ascnum=Ord($temp_str);//得到字符串中第$i位字符的ascii码
    if ($ascnum>=224) //如果ASCII位高与224,
    {
    $returnstr=$returnstr.substr($sourcestr,$i,3); //根据UTF-8编码规范,将3个连续的字符计为单个字符
    $i=$i+3; //实际Byte计为3
    $n++; //字串长度计1
    }
    elseif ($ascnum>=192) //如果ASCII位高与192,
    {
    $returnstr=$returnstr.substr($sourcestr,$i,2); //根据UTF-8编码规范,将2个连续的字符计为单个字符
    $i=$i+2; //实际Byte计为2
    $n++; //字串长度计1
    }
    elseif ($ascnum>=65 && $ascnum<=90) //如果是大写字母,
    {
    $returnstr=$returnstr.substr($sourcestr,$i,1);
    $i=$i+1; //实际的Byte数仍计1个
    $n++; //但考虑整体美观,大写字母计成一个高位字符
    }
    else //其他情况下,包括小写字母和半角标点符号,
    {
    $returnstr=$returnstr.substr($sourcestr,$i,1);
    $i=$i+1; //实际的Byte数计1个
    $n=$n+0.5; //小写字母和半角标点等与半个高位字符宽…
    }
    }
    if ($str_length>$cutlength){
    $returnstr = $returnstr . “…”;//超过长度时在尾处加上省略号
    }
    return $returnstr;
    }
    2、调用方法
    跟mb_strimwidth函数类似,举个相对比的例子:
    用mb_strimwidth函数:
    <?php echo mb_strimwidth(strip_tags(apply_filters(‘the_content’, $post->post_content)), 0, 36,”…”); ?>
    用sub_str:
    <?php echo cut_str(strip_tags(apply_filters(‘the_content’, $post->post_content)),36,”…”); ?>

  • 话题 ‘PHP文章截断函数mb_strimwidth常见用法及乱码解决方法’不再接受新回复。