ユーザーがフォームから送信してくるデータは、必ずしも私たちが意図した通りの形式であるとは限りません。全角と半角が混在していたり、不要な空白が含まれていたり、形式が全く異なっていたりします。
このような多様なデータを正しく安全に扱うために不可欠な技術が、「正規表現」によるパターンマッチングと、「文字列操作関数」によるデータ整形です。
この記事では、入力値のバリデーション(検証)やクリーニング(清掃)に欠かせないこれらの強力なツールを、初心者の方にも分かりやすく解説します。
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-5678
や08012345678
など)をチェックする正規表現です。
<?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アプリケーションを構築するための鍵となります。