php判断字符串长度 strlen()与mb_strlen()函数

我们知道在php中要判断字符串长度我们只要使用strlen()与mb_strlen()函数既可以了,但是并不是我们想得这么简单,特别是在对中英文混合时上面函数有点力不从心,下面我来给各位朋友介绍.

strlen()

PHP strlen() 函数

定义和用法:strlen() 函数返回字符串的长度.

语法:strlen(string)

参数:string

描述:必需,规定要检查的字符串.

PHP实例代码如下:

  1. <?php
  2. $str=‘中文a字1符‘;
  3. echo strlen($str);
  4. echo ‘<br />‘;
  5. echo mb_strlen($str,‘UTF8‘);
  6. //输出结果
  7. //14
  8. //6
  9. ?>

结果分析:在strlen计算时,对待一个UTF8的中文字符是3个长度,所以“中文a字1符”长度是3*4+2=14.

在mb_strlen计算时,选定内码为UTF8,则会将一个中文字符当作长度1来计算,所以“中文a字1符”长度是6.

mb_strlen()函数

需要注意的是,mb_strlen并不是PHP核心函数,使用前需要确保在php.ini中加载了php_mbstring.dll,即确保“extension=php_mbstring.dll”这一行存在并且没有被注释掉,否则会出现未定义函数的问题,代码如下:

  1. <?php
  2. $str=‘中文a字1符‘;
  3. //计算如下
  4. echo (strlen($str) + mb_strlen($str,‘UTF8‘)) / 2;
  5. echo
  6. //输出结果
  7. //10
  8. ?>

“中文a字1符” 的strlen($str)值是14,mb_strlen($str)值是6,则可以计算出“中文a字1符”的占位是10.

讲解这两者之间的区别,代码如下:

  1. <?php
  2. //测试时文件的编码方式要是UTF8
  3. $str='中文a字1符';
  4. echo strlen($str).'<br>';//14
  5. echo mb_strlen($str,'utf8').'<br>';//6
  6. echo mb_strlen($str,'gbk').'<br>';//8
  7. echo mb_strlen($str,'gb2312').'<br>';//10
  8. ?>

结果分析:在strlen计算时,对待一个UTF8的中文字符是3个长度,所以“中文a字1符”长度是3*4+2=14,在mb_strlen计算时,选定内码为UTF8,则会将一个中文字符当作长度1来计算,所以“中文a字1符”长度是6.

虽然上面函数可以简单解决一些中英文混合问题,但是不能用于实实际中,下面我来给各位朋友介绍其它比较好的办法.

PHP获取中英文混合字符串长度的实现代码如下,1中文=1位,2英文=1位,可自行修改,代码如下:

  1. /**
  2. * PHP获取字符串中英文混合长度
  3. * @param $str string 字符串
  4. * @param $$charset string 编码
  5. * @return 返回长度,1中文=1位,2英文=1位
  6. */
  7. function strLength($str,$charset='utf-8'){
  8. if($charset=='utf-8') $str = iconv('utf-8','gb2312',$str);
  9. $num = strlen($str);
  10. $cnNum = 0;
  11. for($i=0;$i<$num;$i++){
  12. if(ord(substr($str,$i+1,1))>127){
  13. $cnNum++;
  14. $i++;
  15. }
  16. }
  17. $enNum = $num-($cnNum*2);
  18. $number = ($enNum/2)+$cnNum;
  19. return ceil($number);
  20. }
  21. //测试输出长度都为15
  22. $str1 = '测试测试测试测试测试测试测试测';
  23. $str2 = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
  24. $str3 = 'aa测试aa测试aa测试aa测试aaaaaa';
  25. echo strLength($str1,'gb2312');
  26. echo strLength($str2,'gb2312');
  27. echo strLength($str3,'gb2312');

截取字符串函数

UTF8编码,在UTF8中,一个中文字符占3个字节,代码如下:

  1. function msubstr($str, $start, $len) {
  2. $tmpstr = "";
  3. $strlen = $start + $len;
  4. for($i = 0; $i < $strlen; $i++){
  5. if(ord(substr($str, $i, 1)) > 127){
  6. $tmpstr.=substr($str, $i, 3);
  7. $i+=2;
  8. }else
  9. $tmpstr.= substr($str, $i, 1);
  10. }
  11. return $tmpstr;
  12. }
  13. echo msubstr("一二三天下致公english",0,10);

GB2312编码,在gb2312中,一个中文字符占2个字节,代码如下:

  1. <?php
  2. function msubstr($str, $start, $len) { //ȡ
  3. $tmpstr = "";
  4. $strlen = $start + $len;
  5. if(preg_match('/[/d/s]{2,}/',$str)){$strlen=$strlen-2;}
  6. for($i = 0; $i < $strlen; $i++) {
  7. if(ord(substr($str, $i, 1)) > 0xa0) {
  8. $tmpstr .= substr($str, $i, 2);
  9. $i++;
  10. } else
  11. $tmpstr .= substr($str, $i, 1);
  12. }
  13. return $tmpstr;
  14. }
  15. ?>

编码兼容性良好的函数,代码如下:

  1. function cc_msubstr($str, $start=0, $length, $charset="utf-8", $suffix=true)
  2. {
  3. if(function_exists("mb_substr"))
  4. return mb_substr($str, $start, $length, $charset);
  5. elseif(function_exists('iconv_substr')) {
  6. return iconv_substr($str,$start,$length,$charset);
  7. }
  8. $re['utf-8'] = "/[/x01-/x7f]|[/xc2-/xdf][/x80-/xbf]|[/xe0-/xef][/x80-/xbf]{2}|[/xf0-/xff]
  9. [/x80-/xbf]{3}/";
  10. $re['gb2312'] = "/[/x01-/x7f]|[/xb0-/xf7][/xa0-/xfe]/";
  11. $re['gbk'] = "/[/x01-/x7f]|[/x81-/xfe][/x40-/xfe]/";
  12. $re['big5'] = "/[/x01-/x7f]|[/x81-/xfe]([/x40-/x7e]|/xa1-/xfe])/";
  13. preg_match_all($re[$charset], $str, $match);
  14. $slice = join("",array_slice($match[0], $start, $length));
  15. if($suffix) return $slice."…";
  16. return $slice;
  17. }