php判断字符串长度 strlen()与mb_strlen()函数
我们知道在php中要判断字符串长度我们只要使用strlen()与mb_strlen()函数既可以了,但是并不是我们想得这么简单,特别是在对中英文混合时上面函数有点力不从心,下面我来给各位朋友介绍.
strlen()
PHP strlen() 函数
定义和用法: strlen() 函数返回字符串的长度.
语法: strlen(string)
参数: string
描述: 必需,规定要检查的字符串.
PHP实例代码如下:
<?php $str =‘中文a字1符‘; echo strlen ( $str ); echo ‘<br />‘; echo mb_strlen( $str ,‘UTF8‘); //输出结果 //14 //6 ?>结果分析: 在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]这一行存在并且没有被注释掉,否则会出现未定义函数的问题,代码如下:
<?php $str =‘中文a字1符‘; //计算如下 echo ( strlen ( $str ) + mb_strlen( $str ,‘UTF8‘)) / 2; echo //输出结果 //10 ?>[中文a字1符] 的strlen($str)值是14,mb_strlen($str)值是6,则可以计算出[中文a字1符]的占位是10.
讲解这两者之间的区别,代码如下:
<?php //测试时文件的编码方式要是UTF8 $str = '中文a字1符' ; echo strlen ( $str ). '<br>' ; //14 echo mb_strlen( $str , 'utf8' ). '<br>' ; //6 echo mb_strlen( $str , 'gbk' ). '<br>' ; //8 echo mb_strlen( $str , 'gb2312' ). '<br>' ; //10 ?>结果分析: 在strlen计算时,对待一个UTF8的中文字符是3个长度,所以[中文a字1符]长度是3*4+2=14,在mb_strlen计算时,选定内码为UTF8,则会将一个中文字符当作长度1来计算,所以[中文a字1符]长度是6.
虽然上面函数可以简单解决一些中英文混合问题,但是不能用于实实际中,下面我来给各位朋友介绍其它比较好的办法.
PHP获取中英文混合字符串长度的实现代码如下,1中文=1位,2英文=1位,可自行修改,代码如下:
/** * PHP获取字符串中英文混合长度 * @param $str string 字符串 * @param $$charset string 编码 * @return 返回长度,1中文=1位,2英文=1位 */ function strLength( $str , $charset = 'utf-8' ){ if ( $charset == 'utf-8' ) $str = iconv( 'utf-8' , 'gb2312' , $str ); $num = strlen ( $str ); $cnNum = 0; for ( $i =0; $i < $num ; $i ++){ if (ord( substr ( $str , $i +1,1))>127){ $cnNum ++; $i ++; } } $enNum = $num -( $cnNum *2); $number = ( $enNum /2)+ $cnNum ; return ceil ( $number ); } //测试输出长度都为15 $str1 = '测试测试测试测试测试测试测试测' ; $str2 = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' ; $str3 = 'aa测试aa测试aa测试aa测试aaaaaa' ; echo strLength( $str1 , 'gb2312' ); echo strLength( $str2 , 'gb2312' ); echo strLength( $str3 , 'gb2312' );截取字符串函数
UTF8编码,在UTF8中,一个中文字符占3个字节,代码如下:
function msubstr( $str , $start , $len ) { $tmpstr = "" ; $strlen = $start + $len ; for ( $i = 0; $i < $strlen ; $i ++){ if (ord( substr ( $str , $i , 1)) > 127){ $tmpstr .= substr ( $str , $i , 3); $i +=2; } else $tmpstr .= substr ( $str , $i , 1); } return $tmpstr ; } echo msubstr( "一二三天下致公english" ,0,10);GB2312编码,在gb2312中,一个中文字符占2个字节,代码如下:
<?php function msubstr( $str , $start , $len ) { //? $tmpstr = "" ; $strlen = $start + $len ; if (preg_match( '/[/d/s]{2,}/' , $str )){ $strlen = $strlen -2;} for ( $i = 0; $i < $strlen ; $i ++) { if (ord( substr ( $str , $i , 1)) > 0xa0) { $tmpstr .= substr ( $str , $i , 2); $i ++; } else $tmpstr .= substr ( $str , $i , 1); } return $tmpstr ; } ?>编码兼容性良好的函数,代码如下:
function cc_msubstr( $str , $start =0, $length , $charset = "utf-8" , $suffix =true) { if (function_exists( "mb_substr" )) return mb_substr( $str , $start , $length , $charset ); elseif (function_exists( 'iconv_substr' )) { return iconv_substr( $str , $start , $length , $charset ); } $re [ 'utf-8' ] = "/[/x01-/x7f]|[/xc2-/xdf][/x80-/xbf]|[/xe0-/xef][/x80-/xbf]{2}|[/xf0-/xff] [/x80-/xbf]{3}/"; $re [ 'gb2312' ] = "/[/x01-/x7f]|[/xb0-/xf7][/xa0-/xfe]/" ; $re [ 'gbk' ] = "/[/x01-/x7f]|[/x81-/xfe][/x40-/xfe]/" ; $re [ 'big5' ] = "/[/x01-/x7f]|[/x81-/xfe]([/x40-/x7e]|/xa1-/xfe])/" ; preg_match_all( $re [ $charset ], $str , $match ); $slice = join( "" , array_slice ( $match [0], $start , $length )); if ( $suffix ) return $slice . "…" ; return $slice ; }查看更多关于php判断字符串长度 strlen()与mb_strlen()函数 - php函数的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://haodehen.cn/did30905