strlen — 文字列の長さ(バイト数)を取得

PHP

strlen()文字列の長さ(バイト数) を整数で返します。UTF-8 などのマルチバイト文字列では「文字数」ではなくバイト数になる点に注意してください。日本語の文字数を数えたい場合は mb_strlen() を使います。

構文

int strlen(string $string)
  • 引数: $string – 長さを調べる文字列
  • 返り値: バイト数(int

基本例

echo strlen("hello");     // 5
echo strlen("");          // 0
echo strlen("a\nb\tc");   // 5(制御文字も1バイトずつ数える)

マルチバイト文字(UTF-8)の注意

$s = "あいう";          // 3文字(UTF-8では各3バイト)
echo strlen($s);        // 9  ← バイト数
echo mb_strlen($s);     // 3  ← 文字数(mbstringが必要)

ポイント: 日本語の「文字数」を制限・バリデーションするなら mb_strlen($s, 'UTF-8') を使う。

よくある用途

1) 空文字チェック

if ($s === '' || strlen($s) === 0) {
    // 空
}

可読性の面では $s === '' が分かりやすいです。strlen() を使うメリットは特にありません。

2) 文字数(実際はバイト数)制限

if (strlen($payload) > 1024) {
    throw new LengthException('Payload too large.');
}

APIやバイナリ扱いではバイト数基準が有効。

3) 前後の空白を除いてチェック

if (strlen(trim($name)) === 0) {
    // 空白のみはNG
}

ありがちな落とし穴と対処

1) 「文字数」と「バイト数」の取り違え

  • 問題: strlen("あ")3 を返す(UTF-8)
  • 対処: 文字数が必要なら mb_strlen($s, 'UTF-8')

2) 入力が文字列以外

  • 問題: 配列やオブジェクトを渡すとエラー・想定外の型変換の原因
  • 対処: 明示的に (string)$value でキャスト、または事前に is_string() でバリデーション。
if (!is_string($value)) {
    throw new InvalidArgumentException('string expected');
}
$len = strlen($value);

3) 改行・タブ・スペースも数えられる

  • 問題: 見た目の「文字数」と一致しない
  • 対処: 目的に応じて trim()、正規表現での除去、preg_replace('/\s+/u', '', $s) などを併用。

4) マルチバイトの「見かけ幅」を測りたい

  • 問題: 全角/半角で表示幅が異なる
  • 対処: 表示幅はフォントや環境依存。コンソール用途なら mb_strwidth() が参考になる場合あり。

5) 末尾のヌルバイト

  • PHPの文字列はバイナリセーフなので "\0" も1バイトとして数えられます。
    例: strlen("a\0b") === 3

例:入力値を「文字数」で制限(日本語対応)

function validateDisplayName(string $name, int $min = 2, int $max = 20): bool {
    // 文字数(UTF-8)で判定
    $len = mb_strlen($name, 'UTF-8');
    return $len >= $min && $len <= $max;
}

var_dump(validateDisplayName("太郎"));       // true(2文字)
var_dump(validateDisplayName("a"));          // false(1文字)
var_dump(validateDisplayName("あいうえお")); // true(5文字)

パフォーマンスのメモ

  • PHPの文字列は長さを保持しているため、strlen() は実装的に 高速です(バイト列全走査を毎回しているわけではありません)。
  • ただし、非文字列からの変換が発生するとコストが増えるため、渡す前に整形するのが吉。

関連関数

  • mb_strlen(string $string, ?string $encoding = null): int … 文字数を取得(マルチバイト対応)
  • mb_strwidth(string $string, ?string $encoding = null): int … 表示幅の概算
  • iconv_strlen(string $string, ?string $encoding = null): inticonv 拡張で文字数
  • strlen と組み合わせる関数: substr / mb_substr, trim, mb_convert_encoding

クイックリファレンス(用途別)

目的使う関数
バイト数が欲しいstrlenstrlen($bin) > 1024
日本語の文字数が欲しいmb_strlenmb_strlen($name,'UTF-8') <= 20
表示幅の目安mb_strwidthmb_strwidth($label) <= 10
前後の空白を無視して空判定trim + strlenstrlen(trim($s)) === 0

結論:

バイナリ/容量判定strlen
日本語の文字数mb_strlen('UTF-8')
という使い分けが基本です。

レン (Wren)

こんにちは。レンです。

Laravelのコードの森に住んでいる、小さな案内役です。
ルーティングの枝やクラスの影を歩きながら、コードの流れや仕組みを眺めています。

このサイトでは、Laravelの基本から実装のコツまで、開発で役立つポイントを静かに整理しています。
難しいことを増やすのではなく、コードの見通しが少し良くなるヒントを届けるのが役目です。

「この処理はどこに書くのがいいのか」
「Laravelではどう考えると整理できるのか」

そんな疑問に、小さなメモを残すような気持ちで記事を書いています。

コードを書いている途中で迷ったとき、
このサイトが少し立ち止まって整理できる場所になればうれしいです。

レン (Wren)をフォローする