utf-8字符串截断函数

» 2010-12-05 65条评论

我在《转用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

“utf-8字符串截断函数”有65条评论

  1. A.shun says:

    沙发 :oops:

    1. Vicia says:

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

    2. zwwooooo says:

      @Vicia
      好久没见

  2. 冰古 says:

    地板 :grin:

    1. zwwooooo says:

      @冰古
      地板好,冬天不冷

    2. 冰古 says:

      @zwwooooo
      你冬天坐地板上試試,不冷就有鬼了。 :arrow:

    3. zwwooooo says:

      @冰古
      其实我打错了,懒得纠正。 :evil:

  3. Choikit says:

    站位觀看~

  4. 球犯 says:

    这次我挺靠前的 好久没上网了 一篇篇过目去~~~

    1. zwwooooo says:

      @球犯
      荒淫荒淫,最新评论都给你刷了 :mrgreen:

  5. [...] This post was mentioned on Twitter by Max Lee, zwwooooo. zwwooooo said: 『ZWWoOoOo新文章』 utf-8字符串截断函数 http://goo.gl/fb/8Zolk [...]

  6. heson says:

    我努力去看懂一下 ```` :?:

    1. zwwooooo says:

      @heson
      结果呢?还是 :?:

  7. Wang says:

    好久 没见php code 有点想它了

  8. socekin says:

    前排占位 :mrgreen:

    1. zwwooooo says:

      @socekin
      杀进前10名! :mrgreen:

  9. 郑永 says:

    渐渐的开始看不懂你的文章了。

    1. zwwooooo says:

      @郑永
      我觉得这篇很简单,以前的文章都能看懂我不信这篇会看不懂

  10. Tiger says:

    不错,虽然我已经用了类似插件 :grin:

  11. 飞晏 says:

    这不是2分之1个mb_strimwidth()嘛,mb_substr()()已经很好用了。

    1. zwwooooo says:

      @飞晏
      mb_substr()会造成长短差异太大

  12. 猪八戒 says:

    我得好好学习一下这些函数了。

  13. 万戈 says:

    居然不是用正则,有点意思

    1. zwwooooo says:

      @万戈
      正则那个还真没认真测试过。。。

  14. 有点蓝 says:

    最近大大们的技术文都少了,莫非互联网的冬天到咧?

    1. zwwooooo says:

      @有点蓝
      不管大大还是小小玩多了就少了

  15. 木本无心 says:

    我也得好好学习学习下。

  16. 阿修 says:

    哦哦,我都忘记是咋截断的了

    1. zwwooooo says:

      @阿修
      厄。。。

  17. 嗯嗯!不错!!!!!

  18. QiQiBoY says:

    我主机根本就不支持mb扩展。。 :mrgreen:

    1. zwwooooo says:

      @QiQiBoY
      。。。你不需要吧

    2. QiQiBoY says:

      @zwwooooo
      不能用我也不强求。。。我马马虎虎一个函数能用就行了。。 :mrgreen:

    3. zwwooooo says:

      @QiQiBoY
      这个对于你这个js高手来说是个小问题

  19. 代码 围观了

  20. koobai says:

    WordPress for Android用了没,今天在市场里下载试了下,貌似很不错。可以管理评论、日志、页面。也可发表新日志~~~

    1. zwwooooo says:

      @koobai
      用了,但很少用

回复给 阿修 ¬
取消回复

昵称 *

网址

B em del U Link Code Quote