何をしたいユーティリティなのか
「指定文字出現回数カウント」は、 ある文字列の中に「特定の文字(または短い文字列)が何回出てくるか」を数えるためのユーティリティです。
例えば、
- カンマが何個あるか
- 改行が何回あるか
- 特定の記号(
@や#)がどれくらい使われているか
を数えたい場面は、業務システムでも意外と多いです。
入力チェック、ログ分析、簡易的なパースなど、 「とりあえず回数を知りたい」というときに、このユーティリティが効いてきます。
コアの考え方:「部分文字列が何回出てくるか」を数える
substr_count を使うのが基本形
PHP には、まさにこの用途のための関数があります。 substr_count です。
substr_count(string $haystack, string $needle): int
PHP「干し草の山(haystack)の中に、針(needle)が何本あるか」を数えるイメージです。
これをそのままラップして、 「指定文字出現回数カウント」ユーティリティにすると、こうなります。
/**
* 文字列中の「指定した文字列」が何回出現するかを数える
*/
function count_occurrences(string $text, string $target): int
{
// 空のターゲットは意味がないので 0 を返す
if ($target === '') {
return 0;
}
return substr_count($text, $target);
}
PHPここでの重要ポイントは、「ターゲットが空文字のときは 0 を返す」と決めていることです。 substr_count に空文字を渡すと挙動がややこしいので、 ユーティリティ側でルールを決めておくと安心です。
例題で挙動を確認する
カンマの数を数える
$text = 'apple,orange,banana,melon';
echo count_occurrences($text, ','); // 3
PHPカンマは 3 回出てくるので、「3」が返ってきます。
特定の単語の出現回数を数える
$text = 'error: something happened. error: retry failed. error: giving up.';
echo count_occurrences($text, 'error'); // 3
PHP"error" という文字列が 3 回出てくるので、「3」が返ってきます。
改行の数を数える(応用)
$text = "1 行目\n2 行目\n3 行目";
echo count_occurrences($text, "\n"); // 2
PHP改行は 2 回なので、「改行数 2」として扱えます。 さっきの「改行数カウント」と同じ考え方ですね。
マルチバイト文字(日本語)を扱うときの注意
substr_count は「バイト」ではなく「文字列」として動く
substr_count は、UTF-8 の日本語を含む文字列でも、 「ターゲット文字列が何回出てくるか」をちゃんと数えてくれます。
$text = '今日は晴れです。今日は気分がいいです。';
echo count_occurrences($text, '今日は'); // 2
PHP"今日は" が 2 回出てくるので、「2」が返ってきます。
ここでのポイントは、「ターゲットを“文字列”として渡す」ことです。 1 文字でも 2 文字でも、substr_count は「その並び」を探してくれます。
実務での使いどころ
入力チェック:「特定の記号の使いすぎ」を防ぎたいとき
例えば、パスワードやユーザー名に対して、 「@ を 1 回までにしたい」「# を 3 回までにしたい」 といった制限をかけたいことがあります。
$username = $_POST['username'] ?? '';
if (count_occurrences($username, '@') > 1) {
$error = '@ は 1 回までにしてください。';
}
PHP「指定文字が何回出てくるか」を数えられると、 こういう細かいルールを簡単に実装できます。
簡易的なフォーマットチェック
例えば、「カンマ区切りの ID リスト」を受け取るときに、 「カンマの数が多すぎないか」をざっくり見たいことがあります。
$idsStr = $_POST['ids'] ?? '';
if (count_occurrences($idsStr, ',') > 99) {
$error = 'ID は 100 個までにしてください。';
}
PHP「カンマの数+1」がだいたい「ID の数」なので、 カンマの数を見て上限をかける、という使い方ができます。
ログ分析で「特定のパターンの頻度」を見る
ログの 1 行の中に、 「ERROR が何回出てくるか」「WARN が何回出てくるか」 をざっくり数えたいときにも使えます。
$line = 'ERROR: something failed. WARN: retrying. ERROR: retry failed.';
$errorCount = count_occurrences($line, 'ERROR');
$warnCount = count_occurrences($line, 'WARN');
PHPこれを集計すれば、 「1 行の中でどれくらいエラーが連発しているか」 といった簡易的な分析ができます。
もう一歩:1 文字単位で数えたい版
「指定文字列」ではなく「指定“1文字”」に限定する
さっきの count_occurrences は「文字列全般」をターゲットにできますが、 「1 文字だけを対象にしたい」版を作っておくと、意図がより明確になります。
/**
* 文字列中の「指定した 1 文字」が何回出現するかを数える
*/
function count_char(string $text, string $char): int
{
// 1 文字でなければ 0(または例外)にする
if (mb_strlen($char, 'UTF-8') !== 1) {
return 0;
}
return substr_count($text, $char);
}
PHP例:
$text = 'あいうえおあい';
echo count_char($text, 'あ'); // 2
echo count_char($text, 'い'); // 2
PHP「1 文字だけを数える」という意図がはっきりするので、 コードを読む人にも分かりやすくなります。
まとめ:今日からの「指定文字出現回数カウント」ユーティリティ
指定文字出現回数カウントの本質は、 「テキストの中で“特定のパターンがどれくらい使われているか”を数値として扱えるようにする」ことです。
そのために、
substr_count($text, $target) で「ターゲット文字列が何回出てくるか」を数える。 ターゲットが空文字のときは 0 と決めておく。 必要なら「1 文字だけ」を対象にした版も用意する。
という処理を 1 本の関数に閉じ込めておきます。
もう一度、基本形を載せておきます。
function count_occurrences(string $text, string $target): int
{
if ($target === '') {
return 0;
}
return substr_count($text, $target);
}
PHPもし、あなたのコードのどこかで「substr_count をそのまま散発的に使っている」箇所があれば、 そこをこのユーティリティに差し替えてみてください。 「何を数えているのか」「空文字はどう扱うのか」が、ぐっと明確になります。
