【6日でできるPHP入門】正規表現

 データ入力の検証、URL ルーティング、テンプレート置換──Web 開発で頻繁に登場する文字列操作を“ひと筆書き”でこなせるのが正規表現 (Regular Expression) です。英数字や記号の並び方をパターンとして記述し、マッチング・抽出・置換など多彩な加工を可能にします。ここでは PHP における正規表現の基本概念から実践的な API の使い方まで、動くコードとともに体系的に解説します。

1.正規表現の基礎

1.1. メタ文字一覧

メタ文字意味
.任意の1文字a.cabc, axc
^文字列の先頭^httphttp:// にマッチ
$文字列の末尾jpg$file.jpg
[]文字集合[abc]a,b,c
[^]文字集合の否定[^0-9] → 数字以外
-範囲指定[A-Z]
+直前1回以上\d+
?直前0回または1回colou?r
{m,n}m〜n 回繰り返し\d{3,4}
()グループ化/キャプチャ(abc)+

1.2. 典型パターン例

パターン説明マッチ例
^[0-9]{3}-[0-9]{4}$郵便番号123-4567
^[A-Za-z0-9._%+-]+@[\w.-]+\.[A-Za-z]{2,}$メールアドレスuser@example.com
https?://.+HTTP/HTTPS URLhttps://php.net

2.PHP の正規表現 API

2.1. 判定 ― preg_match

preg_match(
    string|array $pattern,      // 例: '/^cat$/'
    string       $subject,      // 評価対象
    array|null   &$matches = [] // キャプチャ結果
): int|false                    // 1=一致, 0=不一致, false=エラー

2.2. 置換 ― preg_replace

preg_replace(
    string|array $pattern,
    string|array $replacement,
    string|array $subject,
    int          $limit  = -1,
    int          &$count = null,
    int          $flags  = 0
): string|array|null

3.サンプルコードで学ぶ

3.1. 郵便番号チェック関数

ファイル名: lesson49_1.php

<?php
function is_zip(string $code): bool {
    return (bool)preg_match('/^[0-9]{3}-[0-9]{4}$/', $code);
}

// テスト
$cases = ["060-0001", "1010051", "123-4567"];
foreach ($cases as $c){
    echo $c . (is_zip($c) ? " は郵便番号です。<br>" : " は郵便番号ではありません。<br>");
}
?>

実行結果

3.2. スネークケース → キャメルケース変換

ファイル名: lesson49_2.php

<?php
function snake_to_camel(string $text): string {
    return preg_replace_callback(
        '/_([a-z])/',
        fn($m) => strtoupper($m[1]),
        strtolower($text)
    );
}

echo snake_to_camel("user_name") . "<br>";      // userName
echo snake_to_camel("long_variable_id") . "<br>"; // longVariableId
?>

実行結果

4.拡張テクニック

4.1. マッチ結果をすべて取得 ― preg_match_all

$text = "PHP7, PHP8, PHP8.3";
preg_match_all('/PHP\d(\.\d)?/', $text, $hits);
print_r($hits[0]); // Array ( [0] => PHP7 [1] => PHP8 [2] => PHP8.3 )

4.2. 分割 ― preg_split

$csv = "foo,  bar ,baz";
$parts = preg_split('/\s*,\s*/', $csv);
print_r($parts); // Array ( [0] => foo [1] => bar [2] => baz )

4.3 フィルター ― preg_grep

$words = ["apple", "banana", "cherry"];
$with_a = preg_grep('/a/', $words);
print_r($with_a); // apple, banana

まとめ

  • 正規表現は文字列の規則をパターン化し、判定・検索・置換を一括でこなす強力ツール。
  • PHP では preg_match / preg_replace を中心に、分割・抽出・フィルタリング系 API がそろっている。
  • メタ文字と量指定子の組み合わせを覚えれば、大半の入力検証ロジックを数行で実装できる。