一个效率更高的全半角字符串截取函数-阿里云开发者社区

开发者社区> 开发与运维> 正文
登录阅读全文

一个效率更高的全半角字符串截取函数

简介:
[原创,转载请注明:[url]http://wfyang.blog.51cto.com[/url]]
现在流传的那几个字符串截取函数,一般都是对字符串进行循环判断,如果要截取的串比较长,效率就成了一个问题。
我解决的办法非常简单,还是用substr()函数,只不过在substr($str)的后面带一个chr(0),即substr($str).chr(0)
下面我说一下这种方法的原理。chr(0)代表的是ascii码表中的第一个字符"null",是一个非打印字符(有关chr()函数和ascii码的知识可以参阅PHP手册)。当substr()函数将一个全角字符截掉一半的时候,我们得到的字符串的最后一个字符实际上是被截掉的全角字符的区位码(有关中文字符编码的知识请看这里: [url]http://huggin.bokee.com/3857070.html[/url])。".chr(0)"的作用就是将那个区位码与"000"结合,这同样是一个非打印字符,于是,乱码不见了。
这样做还存在一个问题,那就是字符截取的数量并不是很精确。你用for循环对“我是1个中国人,我热爱我的祖国”这个串进行一下截取就知道了。要解决这个问题,简单一点的方法是写一个函数,在用substr()函数的时候将$length*2,这样截取的长度总量为偶数,在大多数情况下,这能保证返回的字符串长度基本符合需要。更复杂一点的方法是对截取得到的字符串的最后一个字符串进行判断,不过对中文字符串来说,这样精确的截取好象并不是很有意义,反面会降低程序的效率。
下面给出一个简单的函数实现以前验证程序,这里并没有对一些特殊情况进行判断,你可以自己加上。
<?php
//文件名:char.php
//功能:新的字符截取函数
//作者:wfyang
//日期:Mon Nov 20 10:04:08 CST 2006
 
//本函数截取的字符串长度单位为全角字符
function cutstr($str = '',$length = 0)
{
 $length *=2;
 if (strlen($str) <= $length)
  return $str;
 return substr($str,0,$length).chr(0).'…';
}
 
$str = '我是1个中国人,我热爱我的祖国!';
for ($i=1;$i<16;$i++)
{
 echo $i.':'.cutstr($str,$i).'<br/>';
}

 ?>






     本文转自wfyang 51CTO博客,原文链接:http://blog.51cto.com/wfyang/9876,如需转载请自行联系原作者


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章