PHP文章截断函数mb_strimwidth常见用法及乱码解决方法

导语

一直在设计WordPress主题,有时在博客首页不想显示全文,而只输出指定数量的内容,我们就可以使用mb_strimwidth函数用于文章的截断。ZWWoOoOo那里有针对mb_strimwidth函数的介绍,传送门:《mb_strimwidth函数的简单应用》。但如果你是用UTF代码写的,在截断汉字时有时会出现把汉字一分为二并出现乱码的情况,下面是mb_strimwidth函数的使用及乱码解决办法。

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,”…”); ?>
That’s all…



落花生

认准了方向,就要勇敢地走下去,十年磨一剑,我相信,只要坚持,一切都有可能。

相关日志

  1. 没有图片

    2010.12.02

    1024社区?邀请码?

    近来菠萝上网,经常看到有很多网友在找1024…

  2. 没有图片

    2010.05.23

    15个WordPress Nofollow Dofollow插件

    15个推荐的NofollowDofollow…

  3. 没有图片

    2010.09.14

    WordPress 3.0 启用多站功能教程

    WordPress 3.0的多站点模式既可以…

  4. 没有图片

    2011.03.02

    iPad2发布会将于3月3日凌晨开始,期待降价

    消息称,iPad2将于2011年月3日凌晨召…

  5. 没有图片

    2010.05.18

    Ajax Comments-Reply 让你的博客无刷新嵌套评论

    虽然我的博客已经实现了嵌套评论,但还是觉得不…

  6. 没有图片

    2011.01.05

    WordPress 模版参数(一)

    <?php the_author_ni…

评论

  1. 0743U 2011.03.05 5:12下午

    虽然完全不懂。来了就顶一下。。楼主加油。

About

马拉松运动员,沉迷于跑步;关注科技前沿,关注互联网!与跑者、程序员、设计师为伍,一起跑步健身,一起编写程序,为自由而战!