首页 » Web前端 » PHP文章截断函数mb_strimwidth常见用法及乱码解决方法
PHP文章截断函数mb_strimwidth常见用法及乱码解决方法

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,”…”); ?>

无觅相关文章插件,快速提升流量

标签:


已有 12条评论 我也来说两句↓

  1. Louis Han 12-02-26 12:31

    看来我得用cut_str解决乱码的问题了

  2. 乐软库 11-07-22 21:22

    太棒了!已经用上了!

    • liveme 11-07-23 09:47

      非常好用的一个函数。

  3. yixin 11-01-23 00:02

    博主最近在写wp博文,不错啊,有空前来围观交流

    • liveme 11-01-23 00:14

      好啊,记录liveme走过的足迹而已,嘿嘿。。。

  4. kingfin 11-01-19 14:49

    本地测试成功,哈哈,谢谢了! :razz:

    • liveme 11-01-19 14:50

      那就好了,你的站点呢?

  5. 白面包 11-01-19 11:04

    哈哈,很详细,慢慢学习一下!

  6. 有点蓝 11-01-19 08:53

    偶最喜欢技术帝啦 :smile:

    • liveme 11-01-19 12:33

      没什么技术含量,都是借鉴别人的方法。

欢迎评论



The trackbacks and pingpacks: