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对XML的操作详解
Jun 07 PHP
深入php常用函数的使用汇总
Jun 08 PHP
php+js iframe实现上传头像界面无跳转
Apr 29 PHP
Codeigniter实现发送带附件的邮件
Mar 19 PHP
php中define用法实例
Jul 30 PHP
WordPress中登陆后关闭登陆页面及设置用户不可见栏目
Dec 31 PHP
php打乱数组二维数组多维数组的简单实例
Jun 17 PHP
Yii安装与使用Excel扩展的方法
Jul 13 PHP
PHP MYSQL简易交互式站点开发
Dec 27 PHP
php 如何设置一个严格控制过期时间的session
May 05 PHP
Laravel 批量更新多条数据的示例
Nov 27 PHP
php使用curl_init()和curl_multi_init()多线程的速度比较详解
Aug 15 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
web方式ftp
2006/10/09 PHP
php中防止伪造跨站请求的小招式
2011/09/02 PHP
php格式化日期实例分析
2014/11/12 PHP
php表单习惯用的正则表达式
2017/10/11 PHP
PHP实现APP微信支付的实例讲解
2018/02/10 PHP
php微信开发之图片回复功能
2018/06/14 PHP
php设计模式之装饰模式应用案例详解
2019/06/17 PHP
Laravel 自动转换长整型雪花 ID 为字符串的实现
2020/10/27 PHP
JavaScript对象模型-执行模型
2008/04/28 Javascript
一段利用WSH获取登录时间的jscript代码
2008/05/11 Javascript
你必须知道的JavaScript 中字符串连接的性能的一些问题
2013/05/07 Javascript
AngularJS 最常用的功能汇总
2016/02/17 Javascript
从零学习node.js之文件操作(三)
2017/02/21 Javascript
DataTables添加额外的查询参数和删除columns等无用参数实例
2017/07/04 Javascript
Vue2.0实现调用摄像头进行拍照功能 exif.js实现图片上传功能
2018/04/28 Javascript
详解操作虚拟dom模拟react视图渲染
2018/07/25 Javascript
javascript关于“时间”的一次探索
2019/07/24 Javascript
JavaScript原型式继承实现方法
2019/11/06 Javascript
javascript使用正则表达式实现注册登入校验
2020/09/23 Javascript
在antd中setFieldsValue和defaultVal的用法
2020/10/29 Javascript
python 七种邮件内容发送方法实例
2014/04/22 Python
Python EOL while scanning string literal问题解决方法
2020/09/18 Python
python实现音乐下载的统计
2018/06/20 Python
python文本数据处理学习笔记详解
2019/06/17 Python
opencv导入头文件时报错#include的解决方法
2019/07/31 Python
Python操作SQLite数据库过程解析
2019/09/02 Python
pip已经安装好第三方库但pycharm中import时还是标红的解决方案
2020/10/09 Python
CSS3绘制六边形的简单实现
2016/08/25 HTML / CSS
马德里运动鞋商店:Nigra Mercato
2020/02/16 全球购物
关于圣诞节的广播稿
2014/01/26 职场文书
护士医德医风自我评价
2014/09/15 职场文书
优秀党员先进事迹材料
2014/12/18 职场文书
接收函格式
2015/01/30 职场文书
2015年入党积极分子培养考察意见
2015/08/12 职场文书
pytorch中F.avg_pool1d()和F.avg_pool2d()的使用操作
2021/05/22 Python
Go语言 详解net的tcp服务
2022/04/14 Golang