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
PHP 读取文件内容代码(txt,js等)
Dec 06 PHP
PHP多例模式介绍
Jun 24 PHP
浅析HTTP消息头网页缓存控制以及header常用指令介绍
Jun 28 PHP
PHP中上传多个文件的表单设计例子
Nov 19 PHP
WordPress中邮件的一些修改和自定义技巧
Dec 15 PHP
PHP内核探索之解释器的执行过程
Dec 22 PHP
PHP下载文件的函数实例代码
May 18 PHP
PHP常见字符串处理函数用法示例【转换,转义,截取,比较,查找,反转,切割】
Dec 24 PHP
php获取当前url地址的方法小结
Jan 10 PHP
PHP面向对象程序设计之构造方法和析构方法详解
Jun 13 PHP
php解决约瑟夫环算法实例分析
Sep 30 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分页函数
2006/07/08 PHP
PHP file_exists问题杂谈
2012/05/07 PHP
如何在php中正确的使用json
2013/08/06 PHP
php使用ZipArchive提示Fatal error: Class ZipArchive not found in的解决方法
2014/11/04 PHP
php利用事务处理转账问题
2015/04/22 PHP
巧妙破除网页右键禁用的十大绝招
2006/08/12 Javascript
document.all与WEB标准
2020/05/13 Javascript
javascrip关于继承的小例子
2013/05/10 Javascript
node.js中的fs.writeSync方法使用说明
2014/12/15 Javascript
js实现延时加载Flash的方法
2015/11/26 Javascript
jQuery抛物线运动实现方法(附完整demo源码下载)
2016/01/08 Javascript
JQuery实现DIV其他动画效果的简单实例
2016/09/18 Javascript
JavaScript 轮播图和自定义滚动条配合鼠标滚轮分享代码贴
2016/10/28 Javascript
3种不同的ContextMenu右键菜单实现代码
2016/11/03 Javascript
js前端实现多图图片上传预览的两个方法(推荐)
2016/11/18 Javascript
js实现定时进度条完成后切换图片
2017/01/04 Javascript
jQuery插件zTree实现的多选树效果示例
2017/03/08 Javascript
js设计模式之代理模式及订阅发布模式实例详解
2019/08/15 Javascript
javascript实现弹出层效果
2019/12/10 Javascript
优化Vue中date format的性能详解
2020/01/13 Javascript
js点击事件的执行过程实例分析【冒泡与捕获】
2020/04/11 Javascript
VSCode搭建React Native环境
2020/05/07 Javascript
[01:36:57]【09DOTA2第一视角】小骷髅
2014/04/16 DOTA
python Django模板的使用方法
2016/01/14 Python
详解Python3中字符串中的数字提取方法
2017/01/14 Python
python中的tcp示例详解
2018/12/09 Python
Python2与Python3的区别实例分析
2019/04/11 Python
django框架F&amp;Q 聚合与分组操作示例
2019/12/12 Python
python多维数组分位数的求取方式
2020/03/03 Python
python创建文本文件的简单方法
2020/08/30 Python
仓库管理制度
2014/01/21 职场文书
安全宣传标语
2014/06/10 职场文书
公务员个人年终总结
2015/02/12 职场文书
大学生学年个人总结
2015/02/15 职场文书
小学大队长竞选稿
2015/11/20 职场文书
详解JavaScript中Arguments对象用途
2021/08/30 Javascript