strlen($string)は文字列の長さをバイト数で返します。日本語のテキスト、アクセント付きの文字、絵文字で欲しいのは文字数なので、それにはmb_strlen($string)を使います。英語だけのテキストなら、2つは同じ数を返します。
空白、句読点、改行もすべて数えます。strlen("a b\n")は4です。
UTF-8でのバイトと文字の違い
PHPの文字列はバイトの並びで、UTF-8は文字によって使うバイト数が違います。ASCIIの英字と数字は1、éやжのような文字は2、かな、よく使う漢字、中国語の文字、€のような記号は3、ほとんどの絵文字や𠮷のような珍しい漢字は4です。strlen()はバイトを合計し、mb_strlen()は文字を数えます。
バイト数が重要なときはstrlen()を使います。バイト数で制限されたデータベースのカラム、ファイルサイズ、バイナリのプロトコルなどです。人が読むものにはmb_strlen()を使います。文字数カウンター、「最大20文字」のルール、mb_substr()でのテキストの切り詰めなどです。
絵文字と複数のコードポイントでできた文字
mb_strlen()はUnicodeのコードポイントを数えます。読む人には1文字に見えても、複数のコードポイントがつながってできているものがあります。家族の絵文字、国旗、肌の色、文字と結合用のアクセントなどです。
読む人に1文字に見えるもの(書記素クラスタ)を数えるには、intl拡張のgrapheme_strlen()が必要です。
echo grapheme_strlen('👨👩👧'); // 1
echo grapheme_strlen('🇯🇵'); // 1
日本語のフォームの文字数カウンターなら、たいていmb_strlen()で十分です。かなと漢字はどれも1つのコードポイントだからです。
mb_strwidthで表示幅を求める
ターミナルや固定幅のレイアウトでは、全角の日本語は2桁、半角カタカナやラテン文字は1桁を占めます。mb_strwidth()はその幅を返し、日本語の「全角は2文字」というルールはたいていこれを意味します。
文字列が空か確認する
いちばんわかりやすい判定は、''との厳密な比較です。strlen($s) === 0も同じ答えになります。empty($s)は同じではなく、多くのフォームで正当な答えである文字列"0"に対してもtrueを返します。
空白だけの文字列は空ではありません。空白だけなら何もないとみなすべき場合は、先にtrim()に通しましょう。
strlen(null)と文字列以外の値
strlen()は文字列を期待します。nullを渡すと今でも0を返しますが、PHP 8.1以降は非推奨の通知が表示されます。
Deprecated: strlen(): Passing null to parameter #1 ($string) of type string is deprecated in /home/index.php on line 2
配列を渡すとTypeError: strlen(): Argument #1 ($string) must be of type string, array givenが投げられます。
先に値をキャストするか既定値を与えます。たとえばstrlen($value ?? '')です。整数は文字列に変換されるので、strlen(12345)は5です。配列の要素を数えるにはcount()を使います。
ユーザーの入力の長さを検証する
典型的なルールは、trimしたあとで3文字から16文字のユーザー名です。日本語の名前がバイトではなく文字で測られるよう、mb_strlen()を使います。
mb_strlen()の代わりにstrlen()を使うと、やまだたろうは6文字なのに18と数えられ、長すぎるとして拒否されてしまいます。
よくある質問
PHPで文字列の長さを取得するには?
strlen($s)はバイト数を、mb_strlen($s)は文字数を返します。英語だけのテキストなら同じですが、日本語、アクセント付きの文字、絵文字にはmb_strlen()を使います。
日本語のテキストでstrlen()が間違った長さを返すのはなぜですか?
間違っているのではなく、バイトを数えているのです。UTF-8ではかなとよく使う漢字は1文字3バイトで保存されるので、strlen('日本語')は9、mb_strlen('日本語')は3です。
絵文字を含む文字列の文字数を数えるには?
mb_strlen()はUnicodeのコードポイントを数えるので、単純な絵文字は1と数えますが、複数のコードポイントでできた絵文字(家族、国旗、肌の色)はそれより多く数えます。intl拡張のgrapheme_strlen()は、読む人に1文字に見えるものを数えます。
PHPのstrlenとcountの違いは何ですか?
strlen()は文字列の長さを測り、count()は配列の要素を数えます。PHP 8でstrlen()に配列を渡すとTypeErrorが投げられます。
PHPで文字列が空か確認するには?
空文字列と比較します:$s === ''、またはstrlen($s) === 0です。この目的にempty($s)は避けましょう。文字列"0"も空とみなしてしまいます。