PHPの正規表現と文字列操作をマスターしよう【初心者向けガイド】

ユーザーがフォームから送信してくるデータは、必ずしも私たちが意図した通りの形式であるとは限りません。全角と半角が混在していたり、不要な空白が含まれていたり、形式が全く異なっていたりします。

このような多様なデータを正しく安全に扱うために不可欠な技術が、「正規表現」によるパターンマッチングと、「文字列操作関数」によるデータ整形です。

この記事では、入力値のバリデーション(検証)やクリーニング(清掃)に欠かせないこれらの強力なツールを、初心者の方にも分かりやすく解説します。


目次

1. 正規表現によるパターンマッチ

正規表現は、プログラミングの中でも特に強力で、少し難解なテーマの一つです。しかし、基本を理解すれば、複雑な文字列の検証が驚くほどシンプルに記述できます。

1.1. 正規表現とは?

正規表現とは、「文字列のパターンを表現するための特殊な文字列」です。例えば、「郵便番号(数字3桁-数字4桁)」というパターンを表現することで、"123-4567"はOK、"abc-defg""123-456"はNG、といった判定が可能になります。

1.2. PHPでの使い方: preg_match()

PHPで正規表現のマッチングを行うには、preg_match()関数を使うのが基本です。

preg_match(パターン, 対象文字列): マッチすれば1、しなければ0、エラーがあればfalseを返します。

<?php
$postal_code1 = "123-4567";
$postal_code2 = "123-456"; // 最後の桁が足りない

// パターン: 「^」は先頭、「\d{3}」は数字3桁、「-」はハイフン、「\d{4}」は数字4桁、「$」は末尾
$pattern = '/^\d{3}-\d{4}$/';

$result1 = preg_match($pattern, $postal_code1);
$result2 = preg_match($pattern, $postal_code2);

var_dump($result1); // int(1) - マッチ成功
var_dump($result2); // int(0) - マッチ失敗

1.3. 正規表現の基本構文

正規表現は、特殊な意味を持つ「メタ文字」と「量指定子」を組み合わせてパターンを作ります。

【文字種を表す主なメタ文字】 | 構文 | 意味 | | :— | :— | | . | 任意の一文字(改行を除く) | | [] | [abc]のように書き、a,b,cのいずれか一文字 | | \d | 半角数字 ([0-9]) と等価 | | \s | 空白文字(スペース、タブ、改行など) | | \S | \s以外の非空白文字 | | \w | 半角英数字とアンダースコア ([a-zA-Z0-9_]) | | \W | \w以外の文字 |

【繰り返しを表す主な量指定子】 | 構文 | 意味 | | :— | :— | | ? | 直前の文字が0回または1回(ない場合も可) | | * | 直前の文字が0回以上 | | + | 直前の文字が1回以上 | | {n} | 直前の文字がちょうどn回 | | {m,n}| 直前の文字がm回以上、n回以下 |

【挙動を調整する主なパターン修飾子】 パターンの最後(/の後)に付けて、正規表現全体の動作を調整します。 | 修飾子 | 意味 | | :— | :— | | i | 大文字・小文字を区別しない | | m | 複数行モード。^$が各行の行頭/行末にマッチする | | u | パターンと対象文字列をUTF-8として扱う(日本語を扱う際は必須)|

1.4. 実践例:携帯電話番号のチェック

日本の携帯電話番号(090-1234-567808012345678など)をチェックする正規表現です。

<?php
$phone1 = "090-1234-5678"; // OK
$phone2 = "08012345678";   // OK (ハイフンなし)
$phone3 = "060-1234-5678";  // NG (市外局番)

$pattern = '/^0[789]0-?\d{4}-?\d{4}$/u';

var_dump(preg_match($pattern, $phone1)); // int(1)
var_dump(preg_match($pattern, $phone2)); // int(1)
var_dump(preg_match($pattern, $phone3)); // int(0)
  • ^0[789]0: 070, 080, 090のいずれかで始まる。
  • -?: ハイフンが0回または1回(なくても良い)。
  • \d{4}: 数字が4桁。
  • $: 文字列の末尾。

2. 必須の文字列操作関数

データベースに保存する前など、受け取った文字列を整形(クリーニング)することは、データの品質を保つ上で非常に重要です。

2.1. 空白の除去

ユーザー入力には、意図しない前後の空白が含まれがちです。trim系の関数で綺麗に取り除きましょう。

関数説明
trim()文字列の前後の空白を除去
ltrim()文字列の先頭(左側)の空白を除去
rtrim()文字列の末尾(右側)の空白を除去
$str = "  Hello World!  "; // 前後に全角・半角スペース
$trimmed_str = trim($str);
var_dump($trimmed_str); // string(12) "Hello World!"

2.2. 日本語を扱うためのmbstring関数

PHPのstrlen()などの標準関数は、1バイトを1文字としてカウントするため、1文字が複数バイトで構成される日本語(マルチバイト文字)に使うと、意図しない結果になります。日本語を扱う際は、必ずmb_で始まる**mbstring関数**を使いましょう。

関数説明
mb_strlen()文字列の長さを(文字数で)取得
mb_strtolower()文字列を小文字に変換
mb_substr()文字列の一部を切り出す
mb_strpos()特定の文字列が最初に出現する位置を探す
mb_convert_kana()全角・半角カタカナや、ひらがななどを変換

mb_convert_kana()の使用例

<?php
$str_zenkaku = "PHP入門 その1";
// "as"オプション: 全角英数字を半角に、全角スペースを半角に変換
$str_hankaku = mb_convert_kana($str_zenkaku, "as", "UTF-8");
var_dump($str_hankaku); // string(13) "PHP入門 その1"

2.3. 文字列の置換

特定の文字を別の文字に置き換えたり、削除したりします。

  • str_replace(): 単純な文字列の置換に使う。高速。
  • preg_replace(): 正規表現パターンにマッチした部分を置換する。高機能。
<?php
// ユーザー入力から不要な記号(読点、コンマ)を削除する
$input_str = "PHPは、とても楽しい、プログラミング言語です。";
$cleaned_str = str_replace(['、', ','], '', $input_str);
var_dump($cleaned_str); // string(55) "PHPはとても楽しいプログラミング言語です。"

まとめ

  • 正規表現 (preg_match) は、入力値のフォーマット検証(バリデーション)に絶大な効果を発揮する。
  • 文字列操作関数 (trim, mb_系, str_replaceなど)は、データをデータベースに保存する前の整形(クリーニング)に不可欠。

特にユーザーが直接入力するデータを扱う際は、これらのツールを使って「データを疑い、常に整形する」という習慣を身に付けることが、堅牢で安全なWebアプリケーションを構築するための鍵となります。

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

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次