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 相关文章推荐
php magic_quotes_gpc的一点认识与分析
Aug 18 PHP
php数组总结篇(一)
Sep 30 PHP
zend framework多模块多布局配置
Feb 26 PHP
PHP字符串的编码问题的详细介绍
Apr 27 PHP
探寻PHP脚本不报错的原因
Jun 12 PHP
从零开始学YII2框架(五)快速生成代码工具 Gii 的使用
Aug 20 PHP
PHP函数func_num_args用法实例分析
Dec 07 PHP
CodeIgniter生成静态页的方法
May 17 PHP
php源码之将图片转化为data/base64数据流实例详解
Nov 27 PHP
thinkPHP5.0框架命名空间详解
Mar 18 PHP
PHP实现深度优先搜索算法(DFS,Depth First Search)详解
Sep 16 PHP
微信公众平台开发教程③ PHP实现微信公众号支付功能图文详解
Apr 10 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
Php获取金书网的书名的实现代码
2010/06/11 PHP
php的一些小问题
2010/07/03 PHP
PHP中round()函数对浮点数进行四舍五入的方法
2014/11/19 PHP
PHP页面间传递值和保持值的方法
2016/08/24 PHP
centos 7.2下搭建LNMP环境教程
2016/11/20 PHP
PHP数据库操作二:memcache用法分析
2017/08/16 PHP
PHP实现随机数字、字母的验证码功能
2018/08/01 PHP
JavaScript限定复选框的选择个数示例代码
2013/08/25 Javascript
jQuery中的基本选择器用法学习教程
2016/04/14 Javascript
JS动态遍历json中所有键值对的方法(不知道属性名的情况)
2016/12/28 Javascript
JavaScript的继承实现小结
2017/05/07 Javascript
解决JS内存泄露之js对象和dom对象互相引用问题
2017/06/25 Javascript
React 子组件向父组件传值的方法
2017/07/24 Javascript
JS中call和apply函数用法实例分析
2018/06/20 Javascript
JavaScript实现新年倒计时效果
2018/11/17 Javascript
vue 中使用 watch 出现了如下的报错的原因分析
2019/05/21 Javascript
mpvue 页面预加载新增preLoad生命周期的两种方式
2019/10/17 Javascript
vue微信分享插件使用方法详解
2020/02/18 Javascript
vue实现移动端input上传视频、音频
2020/08/18 Javascript
在vue项目中promise解决回调地狱和并发请求的问题
2020/11/09 Javascript
[02:32]DOTA2英雄基础教程 祸乱之源
2013/12/23 DOTA
Python正则表达式的使用范例详解
2014/08/08 Python
Python基础语法(Python基础知识点)
2016/02/28 Python
python xml.etree.ElementTree遍历xml所有节点实例详解
2016/12/04 Python
python爬虫 爬取58同城上所有城市的租房信息详解
2019/07/30 Python
解决TensorFlow训练内存不断增长,进程被杀死问题
2020/02/05 Python
汉森批发:Hansen Wholesale
2018/05/24 全球购物
阿玛尼美妆俄罗斯官网:Giorgio Armani Beauty RU
2020/07/19 全球购物
新闻专业推荐信范文
2013/11/20 职场文书
小学生志愿者活动方案
2014/08/23 职场文书
坚守艰苦奋斗精神坚决反对享乐主义整改措施
2014/09/17 职场文书
乡村教师党员四风问题对照检查材料思想汇报
2014/10/08 职场文书
2015年党员个人工作总结
2015/05/13 职场文书
Nginx访问日志及错误日志参数说明
2021/03/31 Servers
python基础之匿名函数详解
2021/04/21 Python
游戏《我的世界》澄清Xbox版暂无计划加入光追
2022/04/03 其他游戏