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

简介:
[原创,转载请注明:[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,如需转载请自行联系原作者


相关文章
|
10天前
|
索引 容器
06-数据容器str(字符串)-字符串的下标索引/字符串无法修改/查找字符串下标初始值/字符串的替换/字符串的分割/字符串去除前后空格/统计字符串的数量/字符串的循环遍历/对字符串进行分割
06-数据容器str(字符串)-字符串的下标索引/字符串无法修改/查找字符串下标初始值/字符串的替换/字符串的分割/字符串去除前后空格/统计字符串的数量/字符串的循环遍历/对字符串进行分割
|
3月前
|
存储 C# 索引
C# 字符串操作指南:长度、连接、插值、特殊字符和实用方法
字符串用于存储文本。一个字符串变量包含由双引号括起的字符集合
66 2
|
9月前
|
算法 API
【算法】去除字符串中间的多余空格以及反转字符串的几种方法
【算法】去除字符串中间的多余空格以及反转字符串的几种方法
133 0
|
10月前
|
算法
利用切片操作去除字符串空格
利用切片操作去除字符串空格
39 0
|
Java
java字符串拼接,逗号分隔 (已实测可用)
java字符串拼接,逗号分隔 (已实测可用)
289 0
|
机器学习/深度学习 算法
字符串——459. 重复的子字符串
本专栏按照数组—链表—哈希—字符串—栈与队列—二叉树—回溯—贪心—动态规划—单调栈的顺序刷题,采用代码随想录所给的刷题顺序,一个正确的刷题顺序对算法学习是非常重要的,希望对大家有帮助
|
存储 算法
算法题-字符串中的有效括号
算法题-字符串中的有效括号
140 0
1576. 替换所有的问号 : 简单字符串模拟
1576. 替换所有的问号 : 简单字符串模拟
|
C#
C# 将字符串中的多个连续空格变成一个
C# 将字符串中的多个连续空格变成一个
331 0