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程序中的常见漏洞进行攻击
Oct 09 PHP
php中的实现trim函数代码
Mar 19 PHP
一个php Mysql类 可以参考学习熟悉下
Jun 21 PHP
php下尝试使用GraphicsMagick的缩略图功能
Jan 01 PHP
php的mkdir()函数创建文件夹比较安全的权限设置方法
Jul 28 PHP
Java和PHP在Web开发方面对比分析
Mar 01 PHP
smarty模板引擎之分配数据类型
Mar 30 PHP
详解WordPress中的头像缓存和代理中的缓存更新方法
Mar 01 PHP
Joomla开启SEF的方法
May 04 PHP
Ubuntu server 11.04安装memcache及php使用memcache来存储session的方法
May 31 PHP
PHP编程快速实现数组去重的方法详解
Jul 22 PHP
PHP连接MSSQL数据库案例,PHPWAMP多个PHP版本连接SQL Server数据库
Apr 16 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/12/06 PHP
php读取der格式证书乱码解决方法
2015/06/22 PHP
PHP实现简单爬虫的方法
2015/07/29 PHP
浅谈使用PHP开发微信支付的流程
2015/10/04 PHP
php执行多个存储过程的方法【基于thinkPHP】
2016/11/08 PHP
详解PHP神奇又有用的Trait
2019/03/25 PHP
JavaScript的strict模式与with关键字介绍
2014/02/08 Javascript
NodeJS Express框架中处理404页面一个方式
2014/05/28 NodeJs
javascript中AJAX用法实例分析
2015/01/30 Javascript
JavaScript实现获取dom中class的方法
2015/02/09 Javascript
js/jquery判断浏览器类型的方法小结
2015/05/12 Javascript
JS简单循环遍历json数组的方法
2016/04/22 Javascript
jQuery实现字符串全部替换的方法
2016/12/12 Javascript
Bootstrap php制作动态分页标签
2016/12/23 Javascript
JS排序之快速排序详解
2017/04/08 Javascript
vue.js绑定事件监听器示例【基于v-on事件绑定】
2018/07/07 Javascript
小程序如何支持使用 async/await详解
2019/09/12 Javascript
Python基本数据类型详细介绍
2014/03/11 Python
Python生成pdf文件的方法
2014/08/04 Python
Python3解决棋盘覆盖问题的方法示例
2017/12/07 Python
python实现决策树、随机森林的简单原理
2018/03/26 Python
使用Django连接Mysql数据库步骤
2019/01/15 Python
Python神奇的内置函数locals的实例讲解
2019/02/22 Python
十分钟搞定pandas(入门教程)
2019/06/21 Python
Python中猜拳游戏与猜筛子游戏的实现方法
2020/09/04 Python
python 多线程中join()的作用
2020/10/29 Python
通用的Django注册功能模块实现方法
2021/02/05 Python
CSS3 3D立方体效果示例-transform也不过如此
2016/12/05 HTML / CSS
在css3中background-clip属性与background-origin属性的用法介绍
2012/11/13 HTML / CSS
分享CSS3制作卡片式图片的方法
2016/07/08 HTML / CSS
英国护肤品购物网站:Beauty Expert
2016/08/19 全球购物
英国游戏机和游戏购物网站:365games.co.uk
2018/06/18 全球购物
幼儿园托班开学寄语
2014/01/18 职场文书
旅行社各个岗位职责
2014/03/15 职场文书
旅游文化节策划方案
2014/06/06 职场文书
物流管理专业自荐信
2014/06/23 职场文书