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. 没有图片

    2011.01.12

    没有完美的个人,只有完美的团队

    成功源于接纳包容,因为你不可能变得十全十美,…

  2. 没有图片

    2010.06.28

    WordPress Post Thumbnail 文章缩略图功能教程

    WordPress主要是为博客而来的,但如果…

  3. 没有图片

    2011.03.20

    菠萝筐终于被驱逐出境!博客空间搬入美国!

    不知道为什么,菠萝的博客备案被无故注销了,于…

  4. 没有图片

    2010.05.24

    Lightbox v2.04 发布

    Lightbox是一个简单的图片浏览特效JS…

  5. 没有图片

    2010.05.31

    165个矢量图标 5种不同颜色

    小百度今天为大家分享165种矢量图标,5种不…

  6. 没有图片

    2010.09.03

    WordPress上传文件原来如此简单!

    平时我们在用WordPress来上传文件的时…

评论

  1. 0743U 2011.03.05 5:12下午

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