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

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

作成日: 更新日:

基本的な使い方

strtok関数は、指定された文字列を特定の区切り文字で分割し、その部分文字列(トークン)を順次取得する関数です。この関数は、ある文字列の中から意味のある単語やフレーズを抽出する際に役立ちます。

最初の呼び出しでは、分割したい元の文字列と、区切り文字として使用する文字を指定します。区切り文字は1文字だけでなく、複数の文字を組み合わせて指定することも可能です。例えば、「,」「;」「.」といった複数の文字を区切り文字として一度に指定できます。この最初の呼び出しによって、関数は内部で現在の処理位置を記憶します。

2回目以降のstrtok関数の呼び出しでは、元の文字列を再度指定する必要はなく、区切り文字のみを指定します。これにより、関数は前回の処理位置から残りの文字列を分割し、次のトークンを返します。すべての部分文字列が取得され、それ以上分割できる部分がなくなった場合、この関数はfalseを返します。

この関数は元の文字列を直接変更することはありません。また、連続する区切り文字は1つの区切り文字として扱われるため、例えば「word,,next」という文字列を「,」で分割した場合、「word」と「next」の間に空のトークンは生成されません。日本語のようなマルチバイト文字を含む文字列を扱う場合は、期待通りの動作をしないことがあるため、mb_strtokのようなマルチバイトセーフな関数を使用することを推奨します。

構文(syntax)

1<?php
2$string = "apple,banana,orange";
3$token = strtok($string, ","); // 最初のトークンを取得
4
5while ($token !== false) {
6    echo $token . PHP_EOL;
7    $token = strtok(","); // 次のトークンを取得
8}
9?>

引数(parameters)

string $string, string $token

  • string $string: 分割したい元の文字列
  • string $token: 区切り文字として使用する文字列

戻り値(return)

string|false

指定された文字列 $str を、区切り文字 $token によって分割し、分割された文字列の次の部分を返します。 区切り文字が見つからない場合、または文字列の終わりに達した場合は false を返します。

サンプルコード

PHP strtokで文字列を分割する

1<?php
2
3/**
4 * strtok関数を使用して文字列を区切り文字で分割し、
5 * 各トークンを出力する例を示します。
6 * システムエンジニアを目指す初心者の方にも理解しやすいよう、
7 * 分割処理の基本的な流れを追って解説します。
8 */
9function demonstrateStrtok(): void
10{
11    // 分割したい元の文字列を定義します。
12    // ここでは、カンマ、セミコロン、ピリオドが区切り文字として使われています。
13    $sourceString = "Apple,Banana;Orange.Grape";
14
15    // 文字列を分割するための区切り文字(トークン)を定義します。
16    // 複数の区切り文字をまとめて指定できます。
17    $delimiters = ",;.";
18
19    echo "元の文字列: " . $sourceString . PHP_EOL;
20    echo "使用する区切り文字: '" . $delimiters . "'" . PHP_EOL . PHP_EOL;
21    echo "--- 分割されたトークン ---" . PHP_EOL;
22
23    // strtok関数を初めて呼び出す際は、元の文字列と区切り文字の両方を指定します。
24    // これにより、strtokは元の文字列の最初の部分(トークン)を返します。
25    // 以降の呼び出しのために、strtokは内部的に元の文字列の状態を記憶します。
26    $token = strtok($sourceString, $delimiters);
27
28    // strtokがfalseを返すまで(つまり、すべてのトークンが取得されるまで)ループを続けます。
29    // falseは、残りのトークンがないことを意味します。
30    while ($token !== false) {
31        echo "取得したトークン: " . $token . PHP_EOL;
32
33        // 2回目以降のstrtokの呼び出しでは、区切り文字のみを指定します。
34        // strtokは前回の呼び出しで記憶した元の文字列から次のトークンを探します。
35        $token = strtok($delimiters);
36    }
37    echo "------------------------" . PHP_EOL;
38}
39
40// 上記の関数を実行して、strtokの動作を確認します。
41demonstrateStrtok();
42

PHPのstrtok関数は、指定された文字列を特定の区切り文字で分割し、その一部を順次取得するために使用されます。システムエンジニアを目指す初心者の方にとって、文字列処理の基本を理解する上で役立つ関数です。

この関数は、string $stringstring $tokenという2つの引数を受け取ります。$stringは分割したい元の文字列を指定し、$tokenは文字列を区切りたい一つまたは複数の区切り文字を指定します。戻り値は、分割された文字列の一部(トークン)が文字列として返されます。しかし、これ以上分割する部分がない場合はfalseを返します。

サンプルコードでは、"Apple,Banana;Orange.Grape"という元の文字列を、カンマ、セミコロン、ピリオドを区切り文字として分割しています。strtokを最初に呼び出す際には、元の文字列$sourceStringと区切り文字$delimitersの両方を指定します。これにより、最初のトークン"Apple"が取得され、strtokは内部的に現在の処理位置を記憶します。2回目以降の呼び出しでは、区切り文字$delimitersのみを指定することで、記憶された位置から次のトークン("Banana""Orange""Grape"など)を順に探し出し、取得します。

すべてのトークンが取得され、これ以上分割する部分がなくなると、strtokfalseを返します。サンプルコードでは、strtokfalseを返すまでwhileループを継続し、これにより元の文字列のすべてのトークンを順番に処理しています。このようにstrtokを使うと、文字列を効率的に分割して、各部分を簡単に取り出すことが可能です。

strtok関数は、一度元の文字列と区切り文字を指定すると、その後の呼び出しでは区切り文字のみで次の部分(トークン)を順に取得する特殊な動作をします。これは、関数が内部で現在の処理位置を記憶しているためです。そのため、複数の異なる文字列を同時にstrtokで分割しようとすると、意図しない結果になる可能性があります。分割処理は一つの文字列に対して完結させてください。

トークンがもうない場合や、初回呼び出しで元の文字列が空の場合はfalseを返します。ループでトークンを取得する際は、厳密に!== falseで判定することが重要です。また、連続する区切り文字はスキップされ、空のトークンは生成されない点も理解しておきましょう。用途に応じてexplodeなどの他の文字列分割関数も検討してください。

関連コンテンツ

【PHP8.x】strtok関数の使い方 | いっしー@Webエンジニア