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

    2012.07.02

    [父母必看]一位年轻妈妈的亲身经历

    平时我博客一般不发这类的内容的日志的,今天看…

  2. 没有图片

    2011.01.25

    WordPress引号半角自动转全角的解决办法

    修改WordPress安装目录/wp-inc…

  3. 没有图片

    2010.05.22

    Discuz! X1 首页显示论坛的修改方法

    解决了Discuz! X1 UC后台应用通讯…

  4. 没有图片

    2010.08.03

    微软Windows 7 官方最新主题推荐

    这几天听说微软又更新了狼系列的Windows…

  5. 没有图片

    2010.05.26

    2010年北大BBS的牛句子收集

    看着大家转得挺火,菠萝也耐不住了,这些句子确…

  6. 没有图片

    2010.05.07

    学问 诗歌 男人 女人

    学问之美,在于使人一头雾水; 诗歌之美,在于…

评论

  1. 0743U 2011.03.05 5:12下午

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

About

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