《PHP8上級試験対策》preg_match()で郵便番号フォーマットを正規表現マッチング

  • URLをコピーしました!

はじめに

PHPで文字列の形式をチェックしたいときに登場するのが preg_match() 関数。
試験では「パターンの意味」や「戻り値の違い(1/0/false)」を理解しているかを問われます。
今回は郵便番号フォーマットを例に、preg_match() の動作を実際の出力結果から確認していきましょう。

キーワード: preg_match / 正規表現 / \A \z / パターンマッチング /

目次

💡preg_match()の基本構文

preg_match(
    string $pattern,
    string $subject,
    array &$matches = null,
    int $flags = 0,
    int $offset = 0
): int|false
引数説明
$pattern正規表現パターン
$subject調べたい文字列
$matches一致した文字列を格納する配列(参照渡し)
戻り値1:一致、0:不一致、false:エラー

🧩 今回のコード例

<?php
declare(strict_types=1);
error_reporting(-1);

$pattern = '/\A[0-9]{3}[ -]?[0-9]{4}\z/';

$r = preg_match($pattern, '123-4567', $matches);
var_dump($r, $matches);

$r = preg_match($pattern, '1234567', $matches);
var_dump($r, $matches);

$r = preg_match($pattern, '1234-567', $matches);
var_dump($r, $matches);

🧠 正規表現の意味

部分意味
\A文字列の先頭(マルチライン非対応)
[0-9]{3}数字3桁
[ -]?スペースまたはハイフンが0回または1回
[0-9]{4}数字4桁
\z文字列の末尾

👉 郵便番号(例:123-4567または1234567)に完全一致する形式を表しています。

🧾 実行結果とその理由

✅ ケース1: '123-4567'

int(1)
array(1) {
  [0]=>
  string(8) "123-4567"
}
  • 3桁+ハイフン+4桁 → パターン完全一致 → マッチ成功

✅ ケース2: '1234567'

int(1)
array(1) {
  [0]=>
  string(7) "1234567"
}
  • イフンなしでも [ -]? により許容される → マッチ成功

❌ ケース3: '1234-567'

int(0)
array(0) {
}
  • 先頭4桁 → [0-9]{3} に合わない → マッチ失敗

🧮 図解:マッチング構造

入力文字列:123-4567
パターン:  \A[0-9]{3}[ -]?[0-9]{4}\z
              ↑  ↑   ↑   ↑
              │  │   │   └── 数字4桁
              │  │   └───── スペース or ハイフン
              │  └──────── 数字3桁
              └─────────── 文字列先頭・末尾を固定

🎯 試験で押さえるポイント

チェック項目内容
preg_match() の戻り値1:一致、0:不一致、false:エラー
$matches 配列一致部分が自動的に格納される
\A / \z行頭・行末を厳密に固定(^ / $ とは挙動が異なる)
[ -]? の意味スペースまたはハイフンが「0回または1回」出現を許す

✅ まとめ

  • preg_match() は「一致/不一致/エラー」の3値を返す。
  • \A\z は、マルチラインを考慮しない完全固定パターンに使う。
  • [ -]? のような量指定子を活用すると柔軟な形式チェックが可能。

この記事が気に入ったら
いいねしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次