strlen()
PHP strlen() 함수
정의 및 사용법
strlen() 함수는 문자열의 길이를 반환합니다.
구문
strlen(string)
매개변수: 문자열
설명: 필수입니다. 확인할 문자열을 지정합니다.
코드는 다음과 같습니다
<?php $str=‘中文a字1符‘; echo strlen($str); echo ‘<br />‘; echo mb_strlen($str,‘UTF8‘); //输出结果 //14 //6 ?>
결과 분석: strlen 계산시 UTF8 한자는 3개의 길이로 처리되므로 "한자 1자"의 길이는 3이 됩니다. *4+ 2=14
mb_strlen 계산시 내부 코드를 UTF8로 선택하면 한자의 길이가 1로 계산되므로 "한자 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 ?>
"한자1문자"의 strlen($str) 값은 14, mb_strlen($str) 값은 6, 그러면 "한자 한자"를 계산할 수 있습니다. "문자 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길이로 처리되므로 "한자 1문자"의 길이는 3이다 *4+2=14, in mb_strlen
계산시 내부 코드를 UTF8로 선택하면 한자는 길이 1로 계산되므로 "한자 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 인코딩에서는 한자 1개가 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; }