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

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


相关文章
|
Python
Python函数isdigit()--判断字符串是否为数字
Python函数isdigit()--判断字符串是否为数字
267 0
BAT 批处理命令-字符串转化为数字并进行加减运算实例演示,字符串截取数字并进行加减运算
BAT 批处理命令-字符串转化为数字并进行加减运算实例演示,字符串截取数字并进行加减运算
1242 0
BAT 批处理命令-字符串转化为数字并进行加减运算实例演示,字符串截取数字并进行加减运算
|
9月前
|
JavaScript C++
js【详解】比较(数字与数字比较、数字与字符串比较、字符串与字符串比较、字符串与非数字比较……)
js【详解】比较(数字与数字比较、数字与字符串比较、字符串与字符串比较、字符串与非数字比较……)
166 0
|
10月前
|
C++ 安全
高效遍历:C++中分隔字符串单词的3种方法详解与实例
拷贝并交换(Copy-and-Swap)是C++中实现赋值操作符和异常安全拷贝构造函数的技巧。它涉及创建临时对象,使用拷贝构造函数,然后交换数据以确保安全。C++11之前的策略在此后及C++11引入的移动语义和右值引用下仍有效,但后者提供了更高效的实现方式。
|
11月前
|
存储 C# 索引
C# 字符串操作指南:长度、连接、插值、特殊字符和实用方法
字符串用于存储文本。一个字符串变量包含由双引号括起的字符集合
164 2
|
算法 测试技术 C#
C++算法:包含三个字符串的最短字符串
C++算法:包含三个字符串的最短字符串
|
测试技术 索引
根据首尾字符串截取中间字符串
今天分享一个函数:虽然它非常简单,但是真的很好用!也很常用!比如 “我今天真的很高兴” 这句话,要把 `今天` 截取出来,我们可以直接调用函数拿到结果,不需要匹配索引、也不用写正则!
94 0
|
算法 API
【算法】去除字符串中间的多余空格以及反转字符串的几种方法
【算法】去除字符串中间的多余空格以及反转字符串的几种方法
260 0
|
SQL 前端开发 Java
【SQL开发实战技巧】系列(十二):三问(如何对字符串字母去重后按字母顺序排列字符串?如何识别哪些字符串中包含数字?如何将分隔数据转换为多值IN列表?)
如何将分隔数据转换为多值IN列表、如何按字母顺序排列字符串、如何对字符串字母去重后按字母顺序排列字符串、如何删除字符串中的字符保留数字。【SQL开发实战技巧】这一系列博主当作复习旧知识来进行写作,毕竟SQL开发在数据分析场景非常重要且基础,面试也会经常问SQL开发和调优经验,相信当我写完这一系列文章,也能再有所收获,未来面对SQL面试也能游刃有余~。这篇文章还是介绍的字符串处理案例,还是那句话,这些操作太太太常见了。后面还会写,而且是更麻烦更难的需求。
【SQL开发实战技巧】系列(十二):三问(如何对字符串字母去重后按字母顺序排列字符串?如何识别哪些字符串中包含数字?如何将分隔数据转换为多值IN列表?)
LeetCode第三题 “无重复字符的最长子串” 从低效率到高效率
LeetCode第三题 “无重复字符的最长子串” 从低效率到高效率