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
深入理解ob_flush和flush的区别(ob_flush()与flush()使用方法)
Feb 06 PHP
PHP静态调用非静态方法的应用分析
May 02 PHP
php类声明和php类使用方法示例分享
Mar 29 PHP
php实现文件下载实例分享
Jun 02 PHP
Linux下PHP加速器APC的安装与配置笔记
Oct 24 PHP
PHP写日志的实现方法
Nov 05 PHP
ThinkPHP使用Ueditor的方法详解
May 20 PHP
利用php的ob缓存机制实现页面静态化方法
Jul 09 PHP
PHP实现微信提现功能
Sep 30 PHP
php新建文件的方法实例
Sep 26 PHP
phpstorm最新激活码分享亲测phpstorm2020.2.3版可用
Nov 22 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 设计模式之 工厂模式
2008/12/19 PHP
PHP通过正则表达式下载图片到本地的实现代码
2011/09/19 PHP
IIS6.0 开启Gzip方法及PHP Gzip函数分享
2014/06/08 PHP
php 批量查询搜狗sogou代码分享
2015/05/17 PHP
PHP自定义错误用法示例
2016/09/28 PHP
javascript 火狐(firefox)不显示本地图片问题解决
2008/07/05 Javascript
javascript 可以拖动的DIV(二)
2009/06/26 Javascript
jQuery帮助之CSS尺寸(五)outerHeight、outerWidth
2009/11/14 Javascript
JavaScript setTimeout和setInterval的使用方法 说明
2010/03/25 Javascript
fancybox modal的完美解决(右上的X)
2012/10/30 Javascript
JavaScript制作windows经典扫雷小游戏
2015/03/31 Javascript
JS实现定时自动关闭DIV层提示框的方法
2015/05/11 Javascript
Javascript中For In语句用法实例
2015/05/14 Javascript
JS实现鼠标滑过链接改变网页背景颜色的方法
2015/10/20 Javascript
Bootstrap安装环境配置教程分享
2016/05/27 Javascript
JavaScript常用正则验证函数实例小结【年龄,数字,Email,手机,URL,日期等】
2017/01/23 Javascript
基于Vuejs的搜索匹配功能实现方法
2018/03/03 Javascript
Vue Promise的axios请求封装详解
2018/08/13 Javascript
发布Angular应用至生产环境的方法
2018/12/10 Javascript
vue项目打包之后背景样式丢失的解决方案
2019/01/17 Javascript
JavaScript实现简单验证码
2020/08/24 Javascript
[01:46]新英雄登场
2019/09/10 DOTA
Python基础教程之利用期物处理并发
2018/03/29 Python
Python发送邮件测试报告操作实例详解
2018/12/08 Python
Python中asyncio模块的深入讲解
2019/06/10 Python
用python介绍4种常用的单链表翻转的方法小结
2020/02/24 Python
浅析canvas元素的html尺寸和css尺寸对元素视觉的影响
2019/07/22 HTML / CSS
巴西男士胡须和头发护理产品商店:Beard
2017/11/13 全球购物
路政管理专业推荐信
2013/11/11 职场文书
家庭教育先进个人事迹材料
2014/01/24 职场文书
3分钟演讲稿
2014/04/30 职场文书
党员四风自我剖析材料思想汇报
2014/09/13 职场文书
幼师中班个人总结
2015/02/12 职场文书
2015学校六五普法工作总结
2015/04/22 职场文书
2015年环境监察工作总结
2015/07/23 职场文书
公司晚宴祝酒词
2015/08/11 职场文书