php中计算中文字符串长度、截取中文字符串的函数代码


Posted in PHP onAugust 09, 2011

在PHP中,我们都知道有专门的mb_substr和mb_strlen函数,可以对中文进行截取和计算长度,但是,由于这些函数并非PHP的核心函数,所以,它们常常有可能没有开启。当然,如果是用的自己的服务器,则只要在php.ini中开启即可。如果是用的虚拟主机,而服务器又没有开启这方面的函数的话,那就需要我们自己写出点适合咱国情的函数来了。
以下几个函数用起来颇为顺手的。不过要知道,得在utf-8环境下使用。

header('Content-type:text/html;charset=utf-8'); 
/** 
* 可以统计中文字符串长度的函数 
* @param $str 要计算长度的字符串 
* @param $type 计算长度类型,0(默认)表示一个中文算一个字符,1表示一个中文算两个字符 
* 
*/ 
function abslength($str) 
{ 
if(empty($str)){ 
return 0; 
} 
if(function_exists('mb_strlen')){ 
return mb_strlen($str,'utf-8'); 
} 
else { 
preg_match_all("/./u", $str, $ar); 
return count($ar[0]); 
} 
} 
$str = '我们都是中国人啊,ye!'; 
$len = abslength($str); 
var_dump($len); //return 12 
$len = abslength($str,'1'); 
echo '<br />'.$len; //return 22 
/* 
utf-8编码下截取中文字符串,参数可以参照substr函数 
@param $str 要进行截取的字符串 
@param $start 要进行截取的开始位置,负数为反向截取 
@param $end 要进行截取的长度 
*/ 
function utf8_substr($str,$start=0) { 
if(empty($str)){ 
return false; 
} 
if (function_exists('mb_substr')){ 
if(func_num_args() >= 3) { 
$end = func_get_arg(2); 
return mb_substr($str,$start,$end,'utf-8'); 
} 
else { 
mb_internal_encoding("UTF-8"); 
return mb_substr($str,$start); 
} 
} 
else { 
$null = ""; 
preg_match_all("/./u", $str, $ar); 
if(func_num_args() >= 3) { 
$end = func_get_arg(2); 
return join($null, array_slice($ar[0],$start,$end)); 
} 
else { 
return join($null, array_slice($ar[0],$start)); 
} 
} 
} 
$str2 = 'wo要截取zhongwen'; 
echo '<br />'; 
echo utf8_substr($str2,0,-4); //return wo要截取zhon

支持gb2312,gbk,utf-8,big5 中文截取方法
/* 
* 中文截取,支持gb2312,gbk,utf-8,big5 
* 
* @param string $str 要截取的字串 
* @param int $start 截取起始位置 
* @param int $length 截取长度 
* @param string $charset utf-8|gb2312|gbk|big5 编码 
* @param $suffix 是否加尾缀 
*/ 
public function csubstr($str, $start=0, $length, $charset="utf-8", $suffix=true) 
{ 
if(function_exists("mb_substr")) 
{ 
if(mb_strlen($str, $charset) <= $length) return $str; 
$slice = mb_substr($str, $start, $length, $charset); 
} 
else 
{ 
$re['utf-8'] = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/"; 
$re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/"; 
$re['gbk'] = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/"; 
$re['big5'] = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/"; 
preg_match_all($re[$charset], $str, $match); 
if(count($match[0]) <= $length) return $str; 
$slice = join("",array_slice($match[0], $start, $length)); 
} 
if($suffix) return $slice."…"; 
return $slice; 
}
PHP 相关文章推荐
PHP编程之高级技巧——利用Mysql函数
Oct 09 PHP
php无限分类且支持输出树状图的详细介绍
Jun 19 PHP
discuz加密解密函数使用方法和中文注释
Jan 21 PHP
php 使用GD库为页面增加水印示例代码
Mar 24 PHP
几道坑人的PHP面试题 试试看看你会不会也中招
Aug 19 PHP
php导出CSV抽象类实例
Sep 24 PHP
php读取目录及子目录下所有文件名的方法
Oct 20 PHP
php面象对象数据库操作类实例
Dec 02 PHP
php实现读取手机客户端浏览器的类
Jan 09 PHP
PHP中error_reporting函数用法详细介绍
Jun 11 PHP
PHP SPL 被遗落的宝石【SPL应用浅析】
Apr 20 PHP
php/JS实现的生成随机密码(验证码)功能示例
Jun 06 PHP
php数据结构 算法(PHP描述) 简单选择排序 simple selection sort
Aug 09 #PHP
php的urlencode()URL编码函数浅析
Aug 09 #PHP
php简单的会话类代码
Aug 08 #PHP
php中将时间差转换为字符串提示的实现代码
Aug 08 #PHP
兼容firefox,chrome的网页灰度效果
Aug 08 #PHP
用php解析html的实现代码
Aug 08 #PHP
php中设置多级目录session的问题
Aug 08 #PHP
You might like
如何在PHP中使用Oracle数据库(1)
2006/10/09 PHP
windows下PHP_intl.dll正确配置方法(apache2.2+php5.3.5)
2014/01/14 PHP
php操作memcache缓存方法分享
2015/06/03 PHP
PHP检测用户语言的方法
2015/06/15 PHP
joomla数据库操作示例代码
2016/01/06 PHP
PHP正则匹配反斜杠'\'和美元'$'的方法
2017/02/08 PHP
ThinkPHP框架获取最后一次执行SQL语句及变量调试简单操作示例
2018/06/13 PHP
基于PHP的微信公众号的开发流程详解
2020/08/07 PHP
js文本框输入点回车触发确定兼容IE、FF等
2013/11/19 Javascript
简单的ajax连接库分享(不用jquery的ajax)
2014/01/19 Javascript
8个实用的jQuery技巧
2014/03/04 Javascript
js中自定义方法实现停留几秒sleep
2014/07/11 Javascript
JavaScript计算某一天是星期几的方法
2015/08/05 Javascript
Ubuntu系统下Angularjs开发环境安装
2016/09/01 Javascript
IOS中safari下的select下拉菜单文字过长不换行的解决方法
2016/09/26 Javascript
js 弹出虚拟键盘修改密码的简单实例
2016/10/10 Javascript
详解Angular 4.x Injector
2017/05/04 Javascript
React中使用collections时key的重要性详解
2017/08/07 Javascript
关于HTTP传输中gzip压缩的秘密探索分析
2018/01/12 Javascript
Vue2.0结合webuploader实现文件分片上传功能
2018/03/09 Javascript
js中的深浅拷贝问题简析
2019/05/10 Javascript
uni-app微信小程序登录并使用vuex存储登录状态的思路详解
2019/11/04 Javascript
[06:49]2018DOTA2国际邀请赛寻真——VirtusPro傲视群雄
2018/08/12 DOTA
Python中生成器和yield语句的用法详解
2015/04/17 Python
理论讲解python多进程并发编程
2018/02/09 Python
matplotlib 输出保存指定尺寸的图片方法
2018/05/24 Python
在pytorch中对非叶节点的变量计算梯度实例
2020/01/10 Python
python在协程中增加任务实例操作
2021/02/28 Python
CSS3 text shadow字体阴影效果
2016/01/08 HTML / CSS
HTML5使用Audio标签实现歌词同步的效果
2016/03/17 HTML / CSS
专家推荐信模板
2014/05/09 职场文书
上课玩手机的检讨书
2014/10/01 职场文书
2016年春节慰问信息
2015/03/25 职场文书
荒岛余生观后感
2015/06/09 职场文书
交通安全主题班会
2015/08/12 职场文书
vue实力踩坑之push当前页无效
2022/04/10 Vue.js