Old

utf-8字符串截断函数

我在《转用PHP截断函数mb_substr()》这篇文章说过,由于主机对 mb_strimwidth() 函数支持不够好(主要是无法解决)——会出现乱码,所以我转用 php 的另外一个支持中文字符串截断函数 mb_substr(),但:

mb_substr() 函数的文字个数中,英文字母也算1个,这样就造成带有中英文字符的字符串截取后的长短差异太大,不美观啊。

于是想起以前收录过的一段支持utf-8字符串截取的代码,但以前收录时忘了哪里收录的,貌似也没有源代码出处,我稍微改下,用法类似 mb_strimwidth()。不同的是文字个数计算,mb_strimwidth() 中的长度是2个算一个中文字符;而现在这个新写的函数是2个英文字母算1个字符来计算的,中文是1对1。

例如:ZWWoOoOo的博客
总数字是:7个

下面是我修改过的函数代码:(代码扔到主题文件 functions.php 里面)

/*
utf-8 字符串截取函数 edit by zwwooooo
$sourcestr:要截取的字符串,默认空
$i:开始截取地方,默认0
$cutlength:截取长度(文字个数),默认150
$endstr:截取后的字符串末尾字符串,默认是 “....”
*/
function z_substr($sourcestr='',$i=0,$cutlength=150,$endstr='...')
{
	$str_length=strlen($sourcestr);//字符串的字节数
	while (($n<$cutlength) and ($i<=$str_length))
	{
		$temp_str=substr($sourcestr,$i,1);
		$ascnum=Ord($temp_str);//ascii码
		if ($ascnum>=224)
		{
			$returnstr=$returnstr.substr($sourcestr,$i,3);
			$i=$i+3;
			$n++;
		}elseif ($ascnum>=192)
		{
			$returnstr=$returnstr.substr($sourcestr,$i,2);
			$i=$i+2;
			$n++;
		}else
		{
			$returnstr=$returnstr.substr($sourcestr,$i,1);
			$i=$i+1;
			$n=$n+0.5;
		}
	}
	if($i<$str_length)$returnstr.=$endstr;
	return $returnstr;
}

调用方法:参数说明看上面代码注释。

<?php echo z_substr($sourcestr$i$cutlength, $endstr); ?>

具体应用可以参考《mb_strimwidth函数的简单应用》。

就这样,完。

zww
or
oooo

声明: 除非注明,ZWWoOoOo文章均为原创,转载请以链接形式标明本文地址
本文地址: http://zww.me/archives/25356

65 comments

  1. A.shun A.shun Opera 10 Opera 10 Windows XP Windows XP

    沙发 :oops:

    沙发
  2. Vicia Vicia Opera 10 Opera 10 Windows 7 Windows 7

    @A.shun 还以为有沙发呢。= =

  3. 冰古 冰古 Firefox 3 Firefox 3 Windows XP Windows XP

    地板 :grin:

    板凳
  4. ......
  5. zigbee zigbee Google Chrome 8 Google Chrome 8 Windows XP Windows XP

    又出新作了,总是占不到前排呀哈哈。

    21楼
  6. 阿修 阿修 Google Chrome 7 Google Chrome 7 Windows 7 Windows 7

    我是来测试链接会不会变成超链接 http://www.zww.me

    22楼
  7. wmtimes wmtimes Firefox 3 Firefox 3 Windows 7 Windows 7

    现在写代码基本上都用utf-8.

    23楼
  8. 迷笛 迷笛 Google Chrome 8 Google Chrome 8 GNU/Linux GNU/Linux

    一直使用 mb_strimwidth() 函数,说不定以后会有用

    24楼
  9. 竹下无为梦 竹下无为梦 Firefox 3 Firefox 3 Windows XP Windows XP

    真简单啊。

    25楼
  10. Weitian Zhao Weitian Zhao Google Chrome 8 Google Chrome 8 Windows 7 Windows 7

    用到正在改的zsons上了.突然发现关于截断方法的三个文章我都用上了,每次你更新我也更新 :mrgreen:

    26楼
  11. 优趣 优趣 Google Chrome 9 Google Chrome 9 Windows 7 Windows 7

    貌似之前遇到过、就是用这招解决的!

    27楼
  12. 378Q 378Q Firefox 3 Firefox 3 Windows XP Windows XP

    PHP达人。
    在上海的朋友注意了,免费赠送2010SD软件开发2.0大会门票http://www.378q.com.cn/ccav/245.html
    看你有朋友需要不。
    腾讯微博转发地址:http://t.qq.com/p/t/11020024134284
    帮忙转发下。1000多块的门票,没有人去 就浪费了。

    28楼
  13. 小邪 小邪 Google Chrome 9 Google Chrome 9 Windows XP Windows XP

    漂亮!我迟一些直接拿去给牛奶蛋用鸟 ~ :razz: :razz:

    29楼
  14. mice mice Internet Explorer 8 Internet Explorer 8 Windows 7 Windows 7

    相对于截断 我现在还是喜欢css控制- -..
    这玩意对中文就一杯具货.. :evil:

    30楼
  15. mice mice Internet Explorer 8 Internet Explorer 8 Windows 7 Windows 7

    :oops: 我只想到在某些小地方用了 - .-
    截断文章还真没试过..嘿嘿..用到再考虑 :mrgreen:

    31楼
  16. 爱新奇 爱新奇 Google Chrome 7 Google Chrome 7 Windows XP Windows XP

    用过这样的类似的函数来提取描述

    32楼
  17. 宝宝健康成长 宝宝健康成长 Firefox 3 Firefox 3 Windows XP Windows XP

    这个也用上了。

    33楼

Leave a Reply