PHP Tips | 文字列処理:入力補助 - 指定文字出現回数カウント

PHP PHP
スポンサーリンク

何をしたいユーティリティなのか

「指定文字出現回数カウント」は、 ある文字列の中に「特定の文字(または短い文字列)が何回出てくるか」を数えるためのユーティリティです。

例えば、

  • カンマが何個あるか
  • 改行が何回あるか
  • 特定の記号(@#)がどれくらい使われているか

を数えたい場面は、業務システムでも意外と多いです。

入力チェック、ログ分析、簡易的なパースなど、 「とりあえず回数を知りたい」というときに、このユーティリティが効いてきます。

コアの考え方:「部分文字列が何回出てくるか」を数える

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 をそのまま散発的に使っている」箇所があれば、 そこをこのユーティリティに差し替えてみてください。 「何を数えているのか」「空文字はどう扱うのか」が、ぐっと明確になります。

タイトルとURLをコピーしました