Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】preg_match()関数の使い方

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

作成日: 更新日:

基本的な使い方

preg_match関数は、指定された文字列が特定の正規表現パターンにマッチするかどうかを調べる関数です。この関数は、文字列の中から特定の形式のデータを検索したり、ユーザーからの入力値が正しい形式であるかを検証したりする際に非常に役立ちます。

関数の基本的な使い方として、第一引数には検索したい正規表現パターンを、第二引数には検索対象となる文字列を指定します。正規表現パターンは、通常スラッシュ(/)などのデリミタで囲む必要があります。例えば、メールアドレスの形式チェックや、特定のキーワードが含まれているかの確認などに利用できます。

もし、マッチした内容を詳細に取得したい場合は、第三引数に空の配列変数を渡すことができます。この配列には、全体のマッチだけでなく、正規表現内で括弧(())を使って定義された部分(キャプチャグループ)のマッチ結果も格納されます。これにより、文字列から必要な部分だけを効率的に抽出することが可能です。

関数の戻り値は、パターンにマッチする部分が見つかった場合に1を、一つもマッチしなかった場合に0を返します。また、正規表現の構文に誤りがあるなど、エラーが発生した際にはfalseを返しますので、適切なエラーハンドリングを行うことが重要です。preg_match関数は、高度な文字列処理を簡潔に記述できるため、システム開発において多岐にわたる場面で活用される、非常に強力なツールです。

構文(syntax)

1int|false preg_match(string $pattern, string $subject, array &$matches = null, int $flags = 0, int $offset = 0)

引数(parameters)

string $pattern, string $subject, array &$matches = null, int $flags = 0, int $offset = 0

  • string $pattern: 検索する正規表現パターンを指定する文字列
  • string $subject: 検索対象の文字列
  • array &$matches = null: 正規表現にマッチした部分文字列を格納する配列。参照渡しされるため、関数実行後に内容が更新されます。
  • int $flags = 0: 検索の挙動を制御するフラグを指定する整数
  • int $offset = 0: $subject のどこから検索を開始するかを指定する整数

戻り値(return)

int|false

正規表現パターンに文字列がマッチしたかどうかを示す整数値、またはマッチしなかった場合は false を返します。

サンプルコード

PHP preg_match で最初の文字列を検索する

1<?php
2
3/**
4 * 文字列内で正規表現パターンに最初に一致する部分を検索します。
5 *
6 * この関数はPHPのpreg_match関数を使用して、正規表現による単一マッチングの基本を示します。
7 * preg_match_allは文字列内の全ての出現を検索するのに対し、preg_matchは最初に見つかった一致のみを検索します。
8 *
9 * @param string $subject 検索対象の文字列。
10 * @return void
11 */
12function demonstratePregMatchBasic(string $subject): void
13{
14    // 検索したい正規表現パターンを定義します。
15    // この例では、「PHP」という単語を検索します。
16    // かっこ () は「キャプチャグループ」と呼ばれ、一致した部分を個別に取得できます。
17    // i 修飾子は、大文字・小文字を区別しないマッチングを意味します。
18    $pattern = '/(PHP)/i';
19
20    echo "対象文字列: \"" . $subject . "\"\n";
21    echo "検索パターン: \"" . $pattern . "\"\n\n";
22
23    // preg_match関数を実行します。
24    // - $pattern: 検索する正規表現
25    // - $subject: 検索対象の文字列
26    // - $matches: 検索結果を格納する配列 (参照渡し)。
27    //            $matches[0]にはパターン全体の一致、
28    //            $matches[1]以降にはキャプチャグループの一致が格納されます。
29    // 戻り値は一致した回数 (0または1) です。一致しない場合はfalseを返します。
30    if (preg_match($pattern, $subject, $matches)) {
31        echo "一致が見つかりました!\n";
32        echo "---------------------------------\n";
33        echo "完全な一致 (パターン全体): " . $matches[0] . "\n";
34        
35        // キャプチャグループが存在する場合、それらも表示
36        if (isset($matches[1])) {
37            echo "キャプチャグループ1の一致: " . $matches[1] . "\n";
38        }
39
40        echo "\n全てのマッチ情報 (配列形式):\n";
41        print_r($matches);
42    } else {
43        echo "一致は見つかりませんでした。\n";
44    }
45}
46
47// 関数の実行例
48demonstratePregMatchBasic("This is a PHP 8.4.12 string.");
49echo "\n=================================\n\n";
50demonstratePregMatchBasic("Another example with php version.");
51echo "\n=================================\n\n";
52demonstratePregMatchBasic("No match here.");
53

PHPのpreg_match関数は、文字列の中から特定のパターン(正規表現)に最初に一致する部分を検索するために使用されます。文字列内に出現する全ての一致を検索するpreg_match_all関数とは異なり、preg_matchは最初に見つかった一致のみを検出します。

この関数は、検索したい正規表現パターンを定義する$pattern、検索対象の文字列を指定する$subject、そして検索結果を格納するための配列である&$matchesという主要な引数を持ちます。$matches配列には、パターン全体に一致した部分が$matches[0]に、正規表現内で指定されたキャプチャグループに一致した部分が$matches[1]以降に格納されます。

関数の戻り値は、一致が見つかった場合に1を返します。一致するパターンが見つからなかった場合は0を返し、正規表現の構文エラーなどによって処理が失敗した場合はfalseを返します。サンプルコードでは、「PHP」という単語を大文字・小文字を区別せずに検索し、一致した場合にその内容とキャプチャグループの情報を表示することで、preg_matchの基本的な使い方と結果の取得方法を示しています。

preg_match関数は、指定された正規表現パターンに対して、対象文字列内で最初に見つかった一致のみを検索し、その情報を取得します。全ての出現を検索したい場合はpreg_match_all関数を使用しますので、混同しないよう注意が必要です。

検索結果は$matches引数の配列に格納され、$matches[0]にはパターン全体の一致、$matches[1]以降には正規表現内のキャプチャグループ(()で囲まれた部分)の一致内容が格納されます。関数は一致した回数(0または1)を返しますが、正規表現が不正な場合など失敗時にはfalseを返します。そのため、戻り値を厳密にチェックし、エラーハンドリングを検討することが安全なコード利用に繋がります。正規表現の特殊文字を文字列として扱いたい場合は、適切にエスケープしてください。

PHP preg_matchで文字列を検索・抽出する

1<?php
2
3/**
4 * preg_match関数の基本的な使い方を示すサンプル。
5 * 文字列内で特定の正規表現パターンがマッチするかどうかを判定し、
6 * マッチした部分を抽出します。
7 */
8function demonstratePregMatchBasicUsage(): void
9{
10    // 検索対象となる文字列
11    $subject = "今日の会議は2023-10-27に開催されます。";
12
13    // 抽出したい日付の正規表現パターン (例: YYYY-MM-DD形式)
14    // ()で囲むことで、年、月、日を個別の要素として抽出できます。
15    $pattern = '/(\d{4})-(\d{2})-(\d{2})/';
16
17    // preg_match関数を実行
18    // $matches配列には、マッチした結果が格納されます。
19    // 成功すると1、失敗すると0、エラー発生でfalseを返します。
20    if (preg_match($pattern, $subject, $matches)) {
21        echo "パターンがマッチしました。\n";
22        echo "--------------------------\n";
23
24        // $matches[0] には、パターン全体にマッチした文字列が格納されます。
25        echo "全体のマッチ: " . $matches[0] . "\n";
26
27        // $matches[1] 以降には、()で囲んだサブパターンにマッチした文字列が格納されます。
28        echo "抽出された年: " . $matches[1] . "\n";
29        echo "抽出された月: " . $matches[2] . "\n";
30        echo "抽出された日: " . $matches[3] . "\n";
31    } else {
32        // マッチしなかった場合の処理
33        echo "パターンはマッチしませんでした。\n";
34    }
35
36    echo "\n";
37
38    // マッチしない場合の例
39    $subjectNoMatch = "開催日未定";
40    if (preg_match($pattern, $subjectNoMatch, $matchesNoMatch)) {
41        echo "パターンがマッチしました。(このメッセージは表示されません)\n";
42    } else {
43        echo "パターンはマッチしませんでした。(対象文字列: \"{$subjectNoMatch}\")\n";
44    }
45}
46
47// 関数の実行
48demonstratePregMatchBasicUsage();
49
50?>

PHP 8のpreg_match関数は、文字列の中から特定の正規表現パターンに合致する部分を検索し、その結果を取得する際に使用する関数です。

この関数は、最初の引数$patternで検索したい正規表現パターンを、二番目の引数$subjectで検索対象の文字列を指定します。三番目の引数$matchesは配列で、パターンがマッチした場合に、マッチした結果が格納されます。この引数は参照渡しのため、関数実行後に結果を取得できます。戻り値は、パターンがマッチした場合は1、マッチしなかった場合は0、エラーが発生した場合はfalseを返します。

サンプルコードでは、"2023-10-27"のような日付形式の文字列を抽出する例を示しています。正規表現'/(\d{4})-(\d{2})-(\d{2})/'の中で()で囲まれた部分は「サブパターン」と呼ばれ、それぞれ年、月、日といった特定の部分文字列を個別に抽出できます。preg_matchが成功すると、$matches[0]にはパターン全体にマッチした文字列が、$matches[1]以降には()で囲んだ各サブパターンにマッチした部分文字列が格納されます。これにより、一致した文字列全体だけでなく、その中の特定の部分も簡単に取り出すことが可能です。パターンが文字列中に見つからなかった場合は0が返され、マッチしなかった場合の処理が実行されます。

preg_match関数は、パターンにマッチすれば1、マッチしなければ0を返します。正規表現の構文エラーなどが発生した場合はfalseを返すため、これら三つの戻り値の違いに注意が必要です。特にfalseが返された際は、preg_last_error()関数で詳細なエラー内容を確認するとデバッグに役立ちます。

マッチした結果が格納される$matches配列は、preg_match1を返した場合にのみ期待するデータを含みます。$matches[0]にはパターン全体にマッチした部分、$matches[1]以降には正規表現中の括弧(())で囲んだサブパターンが格納されますので、関数が成功した後にのみアクセスするようにしてください。

正規表現パターンは/のようなデリミタで囲む必要があります。また、.*などの特殊文字をリテラルとして扱いたい場合は、必ず\でエスケープしてください。

PHP preg_match 戻り値の動作確認

1<?php
2
3/**
4 * preg_match関数の戻り値の動作を示すサンプルコード。
5 *
6 * preg_matchはパターンマッチングの結果に応じて、以下の値を返します:
7 * - 1: パターンにマッチした
8 * - 0: パターンにマッチしなかった
9 * - false: エラーが発生した
10 */
11function demonstratePregMatchReturnValues(): void
12{
13    // --- ケース 1: パターンにマッチした場合 (戻り値: 1) ---
14    $pattern1 = '/apple/';
15    $subject1 = 'I like apple pie.';
16    $matches1 = []; // マッチした結果を格納する配列
17    $result1 = preg_match($pattern1, $subject1, $matches1);
18
19    echo "--- ケース 1: マッチした場合 ---\n";
20    echo "パターン: '{$pattern1}'\n";
21    echo "対象文字列: '{$subject1}'\n";
22    echo "preg_matchの戻り値: ";
23    if ($result1 === 1) {
24        echo "1 (パターンにマッチしました)\n";
25        echo "マッチした内容 (最初の要素): " . ($matches1[0] ?? 'N/A') . "\n";
26    } elseif ($result1 === 0) {
27        echo "0 (パターンにマッチしませんでした)\n";
28    } else { // $result1 === false
29        echo "false (エラーが発生しました)\n";
30        echo "エラー情報: " . (preg_last_error_msg() ?: '不明なエラー') . "\n";
31    }
32    echo "\n";
33
34    // --- ケース 2: パターンにマッチしなかった場合 (戻り値: 0) ---
35    $pattern2 = '/banana/';
36    $subject2 = 'I like apple pie.';
37    $matches2 = [];
38    $result2 = preg_match($pattern2, $subject2, $matches2);
39
40    echo "--- ケース 2: マッチしなかった場合 ---\n";
41    echo "パターン: '{$pattern2}'\n";
42    echo "対象文字列: '{$subject2}'\n";
43    echo "preg_matchの戻り値: ";
44    if ($result2 === 1) {
45        echo "1 (パターンにマッチしました)\n";
46    } elseif ($result2 === 0) {
47        echo "0 (パターンにマッチしませんでした)\n";
48    } else { // $result2 === false
49        echo "false (エラーが発生しました)\n";
50        echo "エラー情報: " . (preg_last_error_msg() ?: '不明なエラー') . "\n";
51    }
52    echo "\n";
53
54    // --- ケース 3: エラーが発生した場合 (戻り値: false) ---
55    // 不正な正規表現パターン (閉じ括弧がない) を使用してエラーを意図的に発生させる
56    $pattern3 = '/(error_test/'; // 不正なパターン: 閉じ括弧が不足
57    $subject3 = 'This is an error_test string.';
58    $matches3 = [];
59    $result3 = preg_match($pattern3, $subject3, $matches3);
60
61    echo "--- ケース 3: エラーが発生した場合 ---\n";
62    echo "パターン: '{$pattern3}' (不正な正規表現パターン)\n";
63    echo "対象文字列: '{$subject3}'\n";
64    echo "preg_matchの戻り値: ";
65    if ($result3 === 1) {
66        echo "1 (パターンにマッチしました)\n";
67    } elseif ($result3 === 0) {
68        echo "0 (パターンにマッチしませんでした)\n";
69    } else { // $result3 === false
70        echo "false (エラーが発生しました)\n";
71        // preg_last_error_msg() は直前のPCRE関数のエラーメッセージを返します
72        echo "エラー情報: " . (preg_last_error_msg() ?: '不明なエラー') . "\n";
73    }
74    echo "\n";
75}
76
77// 関数を実行して、preg_matchの戻り値の動作を確認します。
78demonstratePregMatchReturnValues();

PHPのpreg_match関数は、指定された文字列が特定の正規表現パターンにマッチするかどうかを調べるための重要な機能です。この関数は、文字列の中から特定の形式のデータを検索したり、入力値が期待する形式に沿っているかを検証したりする際によく利用されます。

引数としては、検索したい正規表現パターンを定義する$pattern、検索対象となる文字列の$subject、そしてパターンにマッチした場合にその結果が格納される配列$matchesを指定します。$matchesは参照渡しのため、関数実行後に結果を受け取ることができます。

preg_match関数の最も重要な点はその戻り値です。この戻り値によって、処理がどのように行われたかを正確に判断できます。具体的には、パターンにマッチする部分が見つかった場合、戻り値は整数値の1となります。一方、パターンにマッチする部分が一つも見つからなかった場合は、戻り値は整数値の0となります。そして、正規表現パターンの記述に誤りがあるなど、処理中にエラーが発生した場合には、戻り値はfalseとなります。サンプルコードでは、これらの3つのケースがそれぞれどのように動作し、異なる戻り値を返すのかを確認いただけます。これにより、preg_match関数を利用する際に、戻り値に応じた適切な処理を実装する重要性が理解できます。

preg_match関数の戻り値は、パターンにマッチした場合の1、マッチしなかった場合の0、そして正規表現に問題があったり実行中にエラーが発生した場合のfalseの3種類があります。初心者は0(マッチしなかった)とfalse(エラー)を混同しやすいため、===のような厳密な比較演算子を使って区別することが非常に重要です。常にfalseが返されるケースを考慮し、エラーハンドリングを行うことで安全なコードになります。エラー時にはpreg_last_error_msg()で具体的な情報を得られますので活用してください。また、マッチした文字列の内容は戻り値ではなく、第三引数で指定した$matches配列に格納されます。

PHP preg_matchで正規表現マッチと取得

1<?php
2
3/**
4 * preg_match関数の基本的な使用例とマッチした値の取得方法を示します。
5 *
6 * この関数は、文字列が特定の正規表現パターンに合致するかどうかをチェックし、
7 * 合致した場合、マッチした部分を配列に格納します。
8 * preg_matchは、最初に見つかったマッチのみを処理します。
9 */
10function demonstratePregMatch(): void
11{
12    // 検証対象の文字列
13    $subject = "今日は2023-10-26です。明日は2023-10-27でしょう。";
14
15    // 日付形式 (YYYY-MM-DD) にマッチする正規表現パターン
16    // かっこ () で囲まれた部分は「キャプチャグループ」と呼ばれ、
17    // マッチした値が $matches 配列に個別に格納されます。
18    // \d{4} は4桁の数字、\d{2} は2桁の数字を表します。
19    // - はリテラルなハイフンです。
20    $pattern = '/(\d{4})-(\d{2})-(\d{2})/';
21
22    echo "--- preg_matchの基本 ---" . PHP_EOL;
23    echo "対象文字列: " . $subject . PHP_EOL;
24    echo "パターン: " . $pattern . PHP_EOL . PHP_EOL;
25
26    // preg_match関数を実行
27    // $matches 変数には、マッチした結果が配列として格納されます。(参照渡し)
28    // 第一引数: 正規表現パターン
29    // 第二引数: 検索対象の文字列
30    // 第三引数: マッチした結果を格納する配列
31    $result = preg_match($pattern, $subject, $matches);
32
33    // 戻り値に基づいて結果を表示
34    if ($result === 1) {
35        echo "正規表現パターンに合致しました。" . PHP_EOL;
36        echo "マッチした回数 (最初の1回): " . $result . PHP_EOL;
37        echo "マッチした内容($matches配列):" . PHP_EOL;
38        // $matches[0] には、パターン全体にマッチした文字列が格納されます。
39        // $matches[1] 以降には、キャプチャグループにマッチした文字列が格納されます。
40        print_r($matches);
41        echo "--------------------------" . PHP_EOL;
42        echo "年: " . $matches[1] . PHP_EOL;
43        echo "月: " . $matches[2] . PHP_EOL;
44        echo "日: " . $matches[3] . PHP_EOL;
45    } elseif ($result === 0) {
46        echo "正規表現パターンに合致しませんでした。" . PHP_EOL;
47    } else { // $result === false の場合 (正規表現パターンに問題があるなどのエラー)
48        echo "preg_match関数でエラーが発生しました。" . PHP_EOL;
49    }
50
51    echo PHP_EOL . "--- マッチしない場合の例 ---" . PHP_EOL;
52    $subjectNoMatch = "今日の天気は晴れです。";
53    $resultNoMatch = preg_match($pattern, $subjectNoMatch, $matchesNoMatch);
54
55    echo "対象文字列: " . $subjectNoMatch . PHP_EOL;
56    echo "パターン: " . $pattern . PHP_EOL . PHP_EOL;
57
58    if ($resultNoMatch === 1) {
59        echo "正規表現パターンに合致しました。" . PHP_EOL;
60    } elseif ($resultNoMatch === 0) {
61        echo "正規表現パターンに合致しませんでした。" . PHP_EOL;
62    } else {
63        echo "preg_match関数でエラーが発生しました。" . PHP_EOL;
64    }
65}
66
67// 関数の実行
68demonstratePregMatch();

PHPのpreg_match関数は、指定した正規表現パターンが対象の文字列中に存在するかどうかを検索する際に使用されます。この関数は、最初に見つかった合致のみを処理し、それ以降の合致は無視します。

第一引数には検索したい正規表現パターンを、第二引数には検索対象の文字列を指定します。第三引数の$matchesは参照渡しの配列で、パターンに合致した結果が格納されます。具体的には$matches[0]にパターン全体にマッチした部分が、正規表現の括弧()で囲まれた「キャプチャグループ」にマッチした内容は$matches[1]以降に順に格納されます。

関数の戻り値は整数またはfalseです。パターンに合致した場合、つまり検索対象の文字列からパターンに該当する部分が見つかった場合は1を返します。合致しなかった場合、見つからなかった場合は0を返します。正規表現パターンに誤りがあるなど、関数の実行中にエラーが発生した場合はfalseを返します。

サンプルコードでは、"今日は2023-10-26です。"という文字列から日付形式YYYY-MM-DDを抽出しています。/(\d{4})-(\d{2})-(\d{2})/というパターンにより、$matches[0]には"2023-10-26"が、$matches[1]には"2023"(年)、$matches[2]には"10"(月)、$matches[3]には"26"(日)がそれぞれ格納されることが示されています。マッチする部分が見つからない場合は、戻り値が0となり、$matches配列は空になります。

preg_matchは文字列中で最初に見つかったパターンのみを検索します。もし複数のパターンをすべて見つけたい場合は、preg_match_all関数をご利用ください。関数の戻り値は、マッチした場合に1、見つからなかった場合に0、正規表現に誤りがあったり実行に失敗した場合にはfalseとなりますので、===を用いた厳密な比較で結果を判定するようにしてください。第3引数の$matches配列には、$matches[0]に全体のマッチした文字列が、$matches[1]以降には正規表現で括弧(())を使って指定した部分(キャプチャグループ)が格納されます。正規表現のパターンはスラッシュ(/)で囲む必要がありますので、記述ミスにご注意ください。

関連コンテンツ