【PHP8.x】str_word_count関数の使い方

str_word_count関数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

str_word_count関数は、指定された文字列に含まれる単語の数を数えたり、単語そのものの情報を取り出したりするPHPの関数です。この関数は、文字列内のスペースや句読点などで区切られた部分を単語と認識し、その合計数を整数値で返します。

第2引数としてフォーマットを指定することで、単語の取得方法を変更できます。フォーマットを「1」に設定すると、文字列内の各単語を要素とする配列が返されます。さらに、「2」に設定すると、単語の開始位置をキー、単語自体を値とする連想配列として単語の情報を取得することが可能です。

また、第3引数では、デフォルトでは単語の一部と見なされないが、単語として扱いたい追加の文字(例えば、ハイフンやアポストロフィーなど)を指定できます。これにより、より柔軟な単語のカウントや抽出が可能になります。

この関数は、テキスト処理やデータ分析において、文字列から単語レベルの情報を効率的に取得したい場合に非常に役立ちます。単語の数を数える場合は整数値、単語の情報を配列で取得する場合は配列が戻り値として返されます。PHPでの文字列操作を学ぶ上で、この関数は非常に基本的ながら強力なツールの一つです。

構文(syntax)

1str_word_count(
2    string $string,
3    int $format = 0,
4    ?string $characters = null
5): array|int

引数(parameters)

string $string, int $format = 0, ?string $characters = null

  • string $string: 単語数をカウントしたい対象の文字列
  • int $format = 0: 返却する形式を指定する整数。
    • 0: 単語の数を整数で返します (デフォルト)。
    • 1: 文字列の配列を返します。
    • 2: キーが単語、値がその単語の出現位置を示す連想配列を返します。
  • ?string $characters = null: 単語を構成するとみなす文字を指定する文字列。指定しない場合は、ASCIIのアルファベット、数字、およびアポストロフィ (') が単語を構成するとみなされます。

戻り値(return)

array|int

この関数は、文字列中の単語数をカウントしたり、単語の配列を返します。指定されたモードによって、整数または文字列の配列が返されます。

サンプルコード

PHP: str_word_countで特殊文字を扱う

1<?php
2
3/**
4 * str_word_count() 関数の使用例を示します。
5 * 特に、特殊文字を単語の一部として扱う方法に焦点を当てています。
6 *
7 * str_word_count() は、文字列内の単語を数えたり、単語を抽出したりするために使用されます。
8 * 第三引数 `$characters` を使うことで、デフォルトでは単語区切りとみなされる文字を
9 * 単語の一部として含めることができます。
10 */
11function demonstrateStrWordCountSpecialCharacters(): void
12{
13    // テスト用の文字列。ハイフンやアポストロフィを含む単語、バージョン番号などを含みます。
14    $text = "This is a well-known programming language, PHP-8.0. It's truly powerful!";
15
16    echo "--- 1. デフォルトの動作 (ハイフンやピリオドを単語区切りとみなす) ---\n";
17    // デフォルトでは、ハイフンやピリオドは単語の区切りとして扱われます。
18    // 例: "well-known" は "well" と "known" に分かれます。
19    // 例: "PHP-8.0" は "PHP", "8", "0" に分かれます。
20    // ただし、アポストロフィ ('') は単語内では区切りとみなされません (例: "It's" は一つの単語)。
21    $wordsDefault = str_word_count($text, 1);
22    echo "単語数: " . count($wordsDefault) . "\n";
23    echo "単語リスト: " . implode(', ', $wordsDefault) . "\n\n";
24
25    echo "--- 2. 特定の特殊文字 ('-', '.') を単語の一部とみなす場合 ---\n";
26    // 第三引数 `$characters` に '-' と '.' を追加することで、これらを単語の一部として扱います。
27    // これにより "well-known" や "PHP-8.0" が一つの単語として認識されるようになります。
28    $additionalChars = "-."; // ハイフンとピリオド
29    $wordsWithSpecialChars = str_word_count($text, 1, $additionalChars);
30    echo "単語数: " . count($wordsWithSpecialChars) . "\n";
31    echo "単語リスト: " . implode(', ', $wordsWithSpecialChars) . "\n\n";
32
33    echo "--- 3. 単語とその開始位置のリスト (format=2) ---\n";
34    // format=2 を使用すると、単語の開始位置をキー、単語自体を値とする関連配列を取得できます。
35    // ここでもハイフンとピリオドを単語の一部として扱った結果を表示します。
36    $wordsWithPositions = str_word_count($text, 2, $additionalChars);
37    echo "単語と位置のリスト (ハイフンとピリオドを単語の一部として扱う):\n";
38    foreach ($wordsWithPositions as $position => $word) {
39        echo "  [位置: {$position}] {$word}\n";
40    }
41}
42
43// 上記のデモンストレーション関数を実行します。
44demonstrateStrWordCountSpecialCharacters();
45
46?>

str_word_count 関数は、指定された文字列の中から単語を数えたり、単語をリストとして抽出したりするために使用されます。

この関数は、第一引数 $string で処理対象の文字列を受け取ります。第二引数 $format は戻り値の形式を指定し、デフォルトでは単語の総数を整数で返します。もし1を指定すると、文字列から抽出された単語の配列が返され、2を指定すると、単語の開始位置をキー、単語自体を値とする連想配列が返されます。第三引数 $characters はオプションで、デフォルトでは単語の区切りとみなされる特定の特殊文字(例えばハイフンなど)を、単語の一部として扱いたい場合にその文字群を指定します。戻り値は、$format の指定に応じて整数または配列となります。

このサンプルコードでは、まずデフォルト設定で str_word_count を実行し、ハイフンやピリオドが単語の区切りとして扱われる例(「well-known」が「well」と「known」に分かれるなど)を示しています。次に、第三引数 $characters にハイフンとピリオドを追加して再度実行することで、「well-known」や「PHP-8.0」といった表記が単一の単語として認識される様子を確認できます。さらに $format に2を指定する例では、単語のリストだけでなく、それぞれの単語が元の文字列のどの位置から始まるかという情報も同時に取得できることを示しており、文字列処理の柔軟性が高まります。このように str_word_count 関数は、文字列中の単語を詳細に分析したり抽出したりする際に非常に有用です。

str_word_count関数は、文字列内の単語を数えたり抽出したりする際に便利です。初心者が特に注意すべきは、第三引数$charactersの利用方法です。この引数に特定の記号(例:ハイフン、ピリオド)を指定すると、それらの記号が単語の区切りではなく、単語の一部として認識されるようになります。これにより、「well-known」や「PHP-8.0」のように記号を含む文字列を一つの単語として正しく扱えます。

また、第二引数$formatによって戻り値が単語数(整数)になったり、単語の配列になったりするため、取得した値の型に注意してコードを記述してください。この関数は主に半角英数字の単語カウントに適しており、日本語などのマルチバイト文字の単語分割には想定通りの結果が得られない場合があるため、その点も留意が必要です。

PHP str_word_count UTF-8文字の単語カウント

1<?php
2
3/**
4 * PHPのstr_word_count関数の基本的な使用方法と、UTF-8文字列での単語カウントの注意点、
5 * およびその代替方法を示します。
6 *
7 * str_word_count関数は、主にASCII文字列の単語カウントに適しており、
8 * UTF-8マルチバイト文字を正しく単語として認識することができません。
9 * UTF-8文字列を扱う場合は、正規表現(preg_match_all)などの代替手段を検討する必要があります。
10 */
11function demonstrateStrWordCountUtf8(): void
12{
13    // 1. ASCII文字列でのstr_word_countの使用例
14    // この場合、str_word_countは期待通りに動作します。
15    $asciiString = "Hello world, how are you doing today?";
16    echo "=== ASCII 文字列での単語カウント ===\n";
17    echo "文字列: '" . $asciiString . "'\n";
18    $wordCountAscii = str_word_count($asciiString);
19    echo "str_word_countでの単語数: " . $wordCountAscii . " (期待値: 7)\n\n";
20
21    // 2. UTF-8文字列でのstr_word_countの使用例と問題点
22    // str_word_countはUTF-8マルチバイト文字を正しく単語として扱いません。
23    // 日本語のようなマルチバイト言語の文字は単語として認識されず、結果が期待と異なります。
24    $utf8String = "こんにちは 世界、PHPは素晴らしい言語です!";
25    echo "=== UTF-8 (日本語) 文字列での単語カウント ===\n";
26    echo "文字列: '" . $utf8String . "'\n";
27    $wordCountUtf8 = str_word_count($utf8String);
28    echo "str_word_countでの単語数: " . $wordCountUtf8 . " (注: 正しくありません)\n";
29    echo "str_word_countはマルチバイト文字を正しく単語として認識しません。\n";
30    echo "(例えば、'こんにちは'や'世界'が単語としてカウントされていません。)\n\n";
31
32    // 3. UTF-8文字列を正しく単語カウントする代替方法 (正規表現)
33    // preg_match_all関数と'u' (Unicode) 修飾子を使用すると、UTF-8文字列の単語を正しく数えられます。
34    // `\p{L}` はUnicodeのあらゆる「文字」(Letter)カテゴリにマッチし、`+` で1つ以上の連続する文字を単語とします。
35    echo "=== UTF-8 (日本語) 文字列を正しく単語カウントする代替方法 ===\n";
36    if (preg_match_all('/\p{L}+/u', $utf8String, $matches)) {
37        $correctWordCountUtf8 = count($matches[0]);
38        echo "preg_match_allでの正しい単語数: " . $correctWordCountUtf8 . " (期待値: 6)\n";
39        echo "検出された単語: ";
40        print_r($matches[0]);
41    } else {
42        echo "単語が見つかりませんでした。\n";
43    }
44    echo "\n";
45}
46
47// 関数を実行して動作を確認します
48demonstrateStrWordCountUtf8();
49
50?>

PHP 8のstr_word_count関数は、文字列内の単語を数えるために使用されます。 第一引数$stringに数えたい文字列を指定し、オプションの第二引数$formatによって戻り値の形式を変えられます。$formatが0(デフォルト)の場合は単語数が整数で返され、それ以外の場合は単語情報を含む配列が戻り値となります。

この関数は、主に英数字などのASCII文字で構成される文字列に対しては正確に機能します。 しかし、日本語のようなUTF-8マルチバイト文字を含む文字列では問題が生じます。str_word_countはマルチバイト文字を単語として正しく認識できないため、「こんにちは」や「世界」といった日本語の単語は適切にカウントされず、期待する結果が得られないことに注意が必要です。

UTF-8文字列の単語を正確に数えたい場合は、正規表現を使用するpreg_match_all関数が効果的な代替手段となります。 例えば、preg_match_all('/\p{L}+/u', $string, $matches)のように記述することで、\p{L}(Unicodeのあらゆる「文字」カテゴリにマッチ)とu修飾子(UTF-8モード)を組み合わせ、マルチバイト文字を含む単語も正しく認識し、その数を取得できます。 したがって、文字列の文字エンコーディングに合わせて、適切な関数を選択することが重要です。

str_word_count関数は主にASCII文字列の単語カウントに適しており、UTF-8などのマルチバイト文字列では単語を正しく認識できない点に注意が必要です。例えば、日本語の文字列をこの関数で処理すると、期待通りの単語数が得られません。UTF-8文字列を正確に単語カウントしたい場合は、代替手段としてpreg_match_all関数と、\p{L}+/uのようなUnicode対応の正規表現を使用してください。これにより、マルチバイト文字で構成される単語も適切に検出できます。コードを利用する際は、対象文字列のエンコーディングと、それに対応した関数の選択が重要であることを理解してください。

関連コンテンツ