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): int…iconv拡張で文字数strlenと組み合わせる関数:substr/mb_substr,trim,mb_convert_encoding
クイックリファレンス(用途別)
| 目的 | 使う関数 | 例 |
|---|---|---|
| バイト数が欲しい | strlen | strlen($bin) > 1024 |
| 日本語の文字数が欲しい | mb_strlen | mb_strlen($name,'UTF-8') <= 20 |
| 表示幅の目安 | mb_strwidth | mb_strwidth($label) <= 10 |
| 前後の空白を無視して空判定 | trim + strlen | strlen(trim($s)) === 0 |
結論:
バイナリ/容量判定 →
strlen
日本語の文字数 →mb_strlen('UTF-8')
という使い分けが基本です。

