第53回: 正規表現 — 複雑な入力チェックを短く書く強力な武器

章: 第6章: 実践運用と成長

郵便番号・電話番号・URLの形式チェック、if文を何行も書いていませんか?正規表現を使えば1行で書けます。

問題と解決策

入力形式の検証を strlen()substr()is_numeric() などの組み合わせで書こうとすると、コードが複雑になりがちです。しかも条件の漏れによるバグも起きやすくなります。

正規表現(Regular Expression)は、文字列のパターンを記号で表現する言語です。preg_match() を使えば、複雑なルールを1行で表現でき、マッチした部分を取り出す(preg_match_all())、置換する(preg_replace())ことも可能です。

正規表現主要関数の比較

関数 用途 戻り値
preg_match($pattern, $str) パターンに一致するか検査 1(一致)/ 0(不一致)/ false(エラー)
preg_match_all($pattern, $str, $matches) 全一致箇所を取得 一致数
preg_replace($pattern, $replace, $str) パターンを置換 置換後の文字列
preg_split($pattern, $str) パターンで分割 配列

チェックポイント: 正規表現のデリミタ(区切り文字)は / ... / が一般的ですが、パターン内に / が含まれる場合は # ... #| ... | に変えることでエスケープを減らせます。

コードサンプル


<?php
$zip = '123-4567';
if (preg_match('/^\d{3}-\d{4}$/', $zip)) {
    echo '郵便番号形式OK';
}

まとめ & 次のステップ

  • preg_match() でパターン一致を検証し、preg_replace() で置換できます
  • ^(先頭)と $(末尾)で入力全体がパターンに一致するか検査できます
  • \d(数字)、\w(英数字)、+(1回以上)、*(0回以上)が基本記号です
  • 正規表現は最初は読みにくいですが、よく使うパターン(メール・電話番号等)を手で書いて覚えましょう

次回は デバッグ — 原因特定を速くするPHPのデバッグ技法を学びます。

Related Articles