はじめに
PHPで文字列の形式をチェックしたいときに登場するのが preg_match() 関数。
試験では「パターンの意味」や「戻り値の違い(1/0/false)」を理解しているかを問われます。
今回は郵便番号フォーマットを例に、preg_match() の動作を実際の出力結果から確認していきましょう。
目次
💡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は、マルチラインを考慮しない完全固定パターンに使う。[ -]?のような量指定子を活用すると柔軟な形式チェックが可能。
