PHP获取中英混合字符串长度的方法


Posted in PHP onJune 07, 2014

今晚在写框架的表单验证类时,需要判断某个字符串长度是否在指定区间内,很自然地,想到了PHP中的strlen函数。

$str = 'Hello world!';
echo strlen($str); // 输出12

然而在PHP自带的函数中,strlen及mb_strlen都是通过计算字符串所占字节数来计算长度的,在不同的编码情况下,中文所占的字节数是不同的。在GBK/GB2312下,中文字符占2个字节,而在UTF-8下,中文字符占3个字节。
$str = '你好,世界!';
echo strlen($str); // GBK或GB2312下输出12,UTF-8下输出18

而我们在判断字符串长度时往往需要判断的是字符的数量,而非字符串所占字节数,如在UTF-8下的这段PHP代码:
$name = '张耕畅';
$len = strlen($name);
// 输出 FALSE,因为在UTF-8下三个中文占9个字节
if($len >= 3 && $len <= 8){
 echo 'TRUE';
}else{
 echo 'FALSE';
}

那么有什么方便而实用的方法可以获得含中文字符串的长度呢?可以用正则计算出中文字符的个数,在GBK/GB2312编码下除以2,UTF-8编码下则除以3,最后再加上非中文字符串的长度,但这样未免太过麻烦。

WordPress这么一段代码,借鉴如下:

$str = 'Hello,世界!';
preg_match_all('/./us', $str, $match);
echo count($match[0]); // 输出9

思想是用正则表达式将字符串分割成单个字符,并直接用count计算出匹配到的字符数,便是我们想要的结果了。

但以上代码在UTF-8编码下并不能处理GBK/GB2312的中文字符串,因为GBK/GB2312的中文字符会被识别为两个字符而计算出来的中文字符数量会翻倍,于是我想到了这么一个办法:

$tmp = @iconv('gbk', 'utf-8', $str);
if(!empty($tmp)){
 $str = $tmp;
}
preg_match_all('/./us', $str, $match);
echo count($match[0]);

可兼容GBK/GB2312及UTF-8编码,经小量数据测试通过,但暂未确定是否完全正确,盼有大牛指点一二。

以上本意是为了框架可以兼容多种编码格式,但一般在日常开发中,一个项目是已经可以确定为何种编码的,因此可以使用以下函数来方便地获取字符串长度:

int iconv_strlen ( string $str [, string $charset = ini_get("iconv.internal_encoding") ] )

PHP 相关文章推荐
资料注册后发信小技巧
Oct 09 PHP
新浪SAE云平台下使用codeigniter的数据库配置
Jun 12 PHP
PHP分页类集锦
Nov 18 PHP
织梦sitemap地图实时推送给百度的教程
Aug 03 PHP
php实现scws中文分词搜索的方法
Dec 25 PHP
PHP实现限制IP访问及提交次数的方法详解
Jul 17 PHP
PHP编程文件处理类SplFileObject和SplFileInfo用法实例分析
Jul 22 PHP
thinkPHP通用控制器实现方法示例
Nov 23 PHP
php post json参数的传递和接收处理方法
May 31 PHP
laravel使用Faker数据填充的实现方法
Apr 12 PHP
tp5框架无刷新分页实现方法分析
Sep 26 PHP
Laravel 前端资源配置教程
Oct 18 PHP
使用PHP破解防盗链图片的一个简单方法
Jun 07 #PHP
PHP防止post重复提交数据的简单例子
Jun 07 #PHP
解决PhpMyAdmin中导入2M以上大文件限制的方法分享
Jun 06 #PHP
php 判断网页是否是utf8编码的方法
Jun 06 #PHP
PHP实现的博客欢迎提示功能(很特别哦)
Jun 05 #PHP
php中数字0和空值的区别分析
Jun 05 #PHP
兼容各大浏览器带关闭按钮的漂浮多组图片广告代码
Jun 05 #PHP
You might like
字符串长度函数strlen和mb_strlen的区别示例介绍
2014/09/09 PHP
微信公众平台DEMO(PHP)
2016/05/04 PHP
PHP Yaf框架的简单安装使用教程(推荐)
2016/06/08 PHP
PHP基于DateTime类解决Unix时间戳与日期互转问题【针对1970年前及2038年后时间戳】
2018/06/13 PHP
基于jQuery实现网页进度显示插件
2015/03/04 Javascript
js倒计时抢购实例
2015/12/20 Javascript
JavaScript电子时钟倒计时第二款
2016/01/10 Javascript
第一次接触神奇的Bootstrap基础排版
2016/07/26 Javascript
js+html5实现侧滑页面效果
2017/07/15 Javascript
react高阶组件经典应用之权限控制详解
2017/09/07 Javascript
解决jquery有正确返回值但不执行success函数的问题
2018/08/20 jQuery
详解TypeScript+Vue 插件 vue-class-component的使用总结
2019/02/18 Javascript
vue+element+Java实现批量删除功能
2019/04/08 Javascript
JavaScript如何借用构造函数继承
2019/11/06 Javascript
[02:05]2014DOTA2西雅图邀请赛 老队长全明星大猜想谁不服就按进显示器
2014/07/08 DOTA
[01:03:36]DOTA2-DPC中国联赛 正赛 VG vs Magma BO3 第二场 1月26日
2021/03/11 DOTA
浅谈Python实现2种文件复制的方法
2018/01/19 Python
Python SQLite3简介
2018/02/22 Python
python能做哪方面的工作
2020/06/15 Python
python实现猜数游戏(保存游戏记录)
2020/06/22 Python
python批量处理多DNS多域名的nslookup解析实现
2020/06/28 Python
Django执行源生mysql语句实现过程解析
2020/11/12 Python
德国宠物用品、宠物食品及水族馆网上商店:ZooRoyal
2017/07/09 全球购物
Lookfantastic葡萄牙官方网站:欧洲第一大化妆品零售商
2018/03/17 全球购物
生产车间实习自我鉴定
2013/09/23 职场文书
汽车专业人才自我鉴定范文
2013/12/29 职场文书
校园十佳歌手策划书
2014/01/22 职场文书
开办大学饮食联盟创业计划书
2014/01/29 职场文书
投资建议书模板
2014/05/12 职场文书
公司任命书范本
2014/06/04 职场文书
竞选班干部演讲稿500字
2014/08/20 职场文书
教师学习群众路线心得体会
2014/11/04 职场文书
2015年小学美术工作总结
2015/05/25 职场文书
辣妈辣妹观后感
2015/06/10 职场文书
导游词之日月潭
2019/11/05 职场文书
Jupyter notebook 不自动弹出网页的解决方案
2021/05/21 Python