【PHP8.x】sscanf関数の使い方
sscanf関数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
sscanf関数は、文字列から、定義されたフォーマットに従ってデータを読み込み抽出する関数です。C言語のscanf関数に似ており、ファイル入力ではなくPHP変数内の文字列を解析する際に用います。
ログエントリや特定の形式の文字列から、日付、数値、文字列などの情報を構造化して取り出す際に非常に有効です。
sscanf関数を使うには、解析対象の文字列とフォーマット文字列の二つの引数を指定します。フォーマット文字列には、データの型を示す「フォーマット指定子」(例: %d整数、%s文字列など)を記述し、取得するデータの形式を指示します。
正常にデータが抽出された場合、sscanf関数は抽出された値を含む配列を返します。各要素はフォーマット指定子の順序に対応します。読み込みに失敗した場合はfalseが返されます。これにより解析成否を容易に確認でき、文字列から特定情報を正確に取得する強力なツールです。
構文(syntax)
1<?php 2$inputString = "Item: Apple, Quantity: 5, Price: 1.20"; 3$format = "Item: %s, Quantity: %d, Price: %f"; 4 5$count = sscanf($inputString, $format, $itemName, $quantity, $price); 6?>
引数(parameters)
string $string, string $format, mixed ...$vars
- string $string: 解析対象となる文字列
- string $format: $string を解析するためのフォーマット文字列
- mixed ...$vars: フォーマット文字列に対応する、解析結果を格納する変数のリスト
戻り値(return)
array|int|null
sscanf関数は、指定されたフォーマット文字列に従って、入力文字列を解析し、その結果を配列として返します。解析に成功した要素の数、またはフォーマット文字列の指定によっては整数を返すこともあります。解析に失敗した場合はnullを返します。
サンプルコード
PHP sscanfで文字列をパースする
1<?php 2 3/** 4 * PHPのsscanf関数を使って文字列からデータをパースするサンプルです。 5 * 6 * sscanf関数は、指定されたフォーマット文字列に基づいて、入力文字列から値を抽出します。 7 * これは、構造化されたログデータや設定ファイルのような文字列から、 8 * 特定の情報を抽出する際に非常に役立ちます。 9 * 10 * @param string $inputString パース対象となる元の文字列。 11 * @param string $formatString 値を抽出するためのフォーマット文字列(printf/scanfスタイル)。 12 * 例: `%d` (整数), `%s` (文字列), `%f` (浮動小数点数), 13 * `%[^,]` (カンマ以外の文字のシーケンス) など。 14 * @return array|null パースされた値を含む配列。パースに失敗した場合はnull。 15 */ 16function demonstrateSscanfUsage(string $inputString, string $formatString): ?array 17{ 18 echo "--- sscanf 実行例 ---\n"; 19 echo "元の文字列: '" . $inputString . "'\n"; 20 echo "フォーマット: '" . $formatString . "'\n"; 21 22 // sscanf関数を使って文字列をパースします。 23 // 成功するとパースされた値の配列を返し、失敗するとnullを返します。 24 $parsedData = sscanf($inputString, $formatString); 25 26 if ($parsedData !== null) { 27 echo "パース結果:\n"; 28 foreach ($parsedData as $key => $value) { 29 // 値が文字列の場合、引用符で囲んで表示し、その他の型はそのまま表示します。 30 $displayValue = is_string($value) ? "'" . $value . "'" : (string)$value; 31 echo " [" . $key . "]: " . $displayValue . "\n"; 32 } 33 return $parsedData; 34 } else { 35 echo "エラー: データパースに失敗しました。\n"; 36 return null; 37 } 38} 39 40// --- sscanf の基本的な使い方 --- 41 42// 1. シンプルなログ行からのデータ抽出 43$logEntry = "USER:john_doe ID:101 STATUS:success TIME:2023-10-27_14:30:00"; 44// `%s`: 文字列, `%d`: 整数 45$logFormat = "USER:%s ID:%d STATUS:%s TIME:%s"; 46demonstrateSscanfUsage($logEntry, $logFormat); 47 48echo "\n"; // 区切りのための改行 49 50// 2. カンマ区切り(CSVライク)データからの抽出 51// `%[^,]`: カンマ以外のすべての文字を読み取ります。 52$csvData = "ProductA,15,9.99"; 53$csvFormat = "%[^,],%d,%f"; // `%f`: 浮動小数点数 54demonstrateSscanfUsage($csvData, $csvFormat); 55 56echo "\n"; // 区切りのための改行 57 58// 3. パース失敗の例 (フォーマットと文字列が一致しない場合) 59$invalidData = "ITEM:WidgetA PRICE:100"; // 数量がない 60$invalidFormat = "ITEM:%s QUANTITY:%d PRICE:%f"; 61demonstrateSscanfUsage($invalidData, $invalidFormat); 62 63?>
PHPのsscanf関数は、指定されたフォーマット文字列に基づいて、入力された文字列から特定のデータを抽出する際に使用します。これは、ログファイルや設定ファイルなど、構造化された文字列から必要な情報だけを効率的に取り出したい場合に非常に役立つ機能です。
この関数の最初の引数$stringには、解析したい元の文字列を指定します。次に$format引数には、抽出するデータのパターンを示すフォーマット文字列を渡します。このフォーマット文字列は、%d(整数)、%s(文字列)、%f(浮動小数点数)といったおなじみの形式の他に、%[^,]のように特定の文字セット以外を読み込むといった柔軟な指定も可能です。
sscanf関数は、データ抽出に成功した場合、フォーマットに従ってパースされた値を順番に格納した配列を戻り値として返します。もし、指定されたフォーマットと入力文字列が一致せず、データのパースに失敗した場合は、戻り値としてnullを返しますので、パースの成否を判断することができます。参照渡しで値を直接受け取ることもできますが、一般的には配列での取得がシンプルです。
sscanf関数は、フォーマット文字列が入力文字列と厳密に一致しないと、データパースに失敗する点に注意してください。特に、区切り文字や空白の有無がフォーマットと異なると、期待通りの結果が得られないことがあります。パースに失敗した場合、この関数はnullを返すため、必ず戻り値がnullでないかを確認し、エラーハンドリングを行う習慣をつけましょう。これにより、予期せぬプログラムの停止を防げます。また、%dや%fなどのフォーマット指定子により、自動的にデータ型が変換されますが、意図しない型に変換されていないか結果を確認することが重要です。非常に複雑な文字列の解析では、sscanfよりも正規表現関数(preg_matchなど)の方が柔軟に対応できる場合がありますので、用途に応じて適切な関数を選択してください。sscanfは、比較的固定的な形式のデータ抽出に適しています。