ホームページ >バックエンド開発 >PHPチュートリアル >PHP は文字列の長さを決定します strlen() および mb_strlen() 関数
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 文字 1 文字」の長さは 3*4+2=14 になります
mb_strlen を計算する場合, select 内部コードがUTF8の場合、中国語の文字は長さ1として計算されるので、「中国語の文字1文字」の長さは6になります
mb_strlen()関数
なお、mb_strlenはPHP のコア関数ではないため、使用する前に、php_mbstring.dll が php.ini にロードされていることを確認する必要があります。つまり、「extension=php_mbstring.dll」という行が存在し、コメントアウトされていないことを確認してください。そうしないと問題が発生します。未定義の関数が発生します。
コードは次のとおりです
<?php $str=‘中文a字1符‘; //计算如下 echo (strlen($str) + mb_strlen($str,‘UTF8‘)) / 2; echo //输出结果 //10 ?>
「中国語1文字1文字」のstrlen($str)値は14、mb_strlen($str)値は6です。すると、「中国語」のプレースホルダーは次のように計算できます。 1文字1文字"は10です。
2つの違いを説明します
コードは次のとおりです
<?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 です。 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');
Intercept stringinfunction
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);
互換性のある良い関数
のコードは以下の通りです
<?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; } ?>