「英数字のみ抽出」でやりたいことをイメージする
まず、ゴールのイメージからはっきりさせます。
"ユーザーID: user-001" → "user001"
"商品コード ABC-123-JP" → "ABC123JP"
"@Test_123!" → "Test123"
"123ABCあいう" → "123ABC"
やりたいことはシンプルです。
文字列の中から「英字(A〜Z, a〜z)と数字(0〜9)だけ」を取り出したい。
記号・スペース・日本語などは全部いらない。
ユーザーID、商品コード、トラッキングID、クーポンコードなど、
「英数字だけで構成されるべき値」を扱うときに、かなりよく使うパターンです。
基本形:正規表現で「英数字以外」を全部消す
preg_replace で「いらないものを空文字にする」
PHP で「特定の条件に合わない文字を全部消す」定番は、preg_replace です。
「英数字以外を全部消す」は、こう書けます。
/**
* 英数字以外の文字をすべて削除して、「英数字だけの文字列」にする
*/
function onlyAlphaNum(string $value): string
{
return preg_replace('/[^A-Za-z0-9]/', '', $value);
}
PHPパターン /[^A-Za-z0-9]/ を分解すると、
[A-Za-z0-9]は「英大文字・英小文字・数字のどれか1文字」[^A-Za-z0-9]は「それ以外の1文字」- それを
''(空文字)に置き換える → 「英数字以外を全部消す」
という意味になります。
例で動きを確認する
echo onlyAlphaNum("ユーザーID: user-001"); // user001
echo onlyAlphaNum("商品コード ABC-123-JP"); // ABC123JP
echo onlyAlphaNum("@Test_123!"); // Test123
echo onlyAlphaNum("###"); // (空文字)
PHP「英字と数字だけ残す」という割り切りなので、
ハイフン、アンダースコア、日本語、記号などはきれいさっぱり消えます。
全角英数字もちゃんと扱いたい場合
日本語入力だと「全角英数字」が混ざる
日本語環境だと、ユーザーが全角で英数字を入力してくることがあります。
"ABC123"
"ユーザーID:ABC-123"
さっきの onlyAlphaNum() にそのまま渡すと、
全角英数字は「A〜Z, a〜z, 0〜9 ではない」ので、全部消えてしまいます。
echo onlyAlphaNum("ABC123"); // (空文字)
PHPこれでは困るので、「全角英数字を半角に変換してから、英数字以外を消す」という二段構えにします。
mb_convert_kana で全角英数字 → 半角英数字
/**
* 全角英数字も含めて、「英数字だけの文字列」にする
*/
function onlyAlphaNumWithZenkaku(string $value): string
{
// 全角英数字を半角に変換
$value = mb_convert_kana($value, 'a', 'UTF-8');
// 英数字以外を削除
return preg_replace('/[^A-Za-z0-9]/', '', $value);
}
PHPmb_convert_kana($value, 'a', 'UTF-8') の 'a' は「全角英数字 → 半角英数字」という指定です。
これで、次のように動きます。
echo onlyAlphaNumWithZenkaku("ABC123"); // ABC123
echo onlyAlphaNumWithZenkaku("ユーザーID:ABC-123"); // ABC123
echo onlyAlphaNumWithZenkaku("123ABCあいう"); // 123ABC
PHP日本語環境の業務システムなら、
「全角英数字を半角にしてから英数字以外を消す」は、かなり実用度が高いパターンです。
「英数字だけにする」ことの実務的な意味
ID・コード系の「ゆらぎ」を一箇所で吸収できる
例えば、商品コードが本来は「英数字だけ」の仕様だとしても、現実にはこうなりがちです。
- 間にハイフンが入っている
"ABC-123" - 全角で入力されている
"ABC123" - 末尾にスペースが付いている
"ABC123 "
これをアプリケーションのあちこちで個別に対処し始めると、すぐにカオスになります。
そこで、
「商品コードを扱う前に、必ず
onlyAlphaNumWithZenkaku()を通す」
というルールを決めてしまうと、
「入力のゆらぎ」を一箇所で吸収できるようになります。
結果として、
- DB の中身がきれいにそろう(検索しやすい)
- 比較・重複チェックが正しく動く
- バグの原因が減る
という、地味だけど効き目の大きいメリットが出てきます。
比較・検索の前処理として使う
例えば、「ユーザーが入力したクーポンコードが有効かどうか」をチェックする場面。
$rawCode = $_POST['coupon'] ?? '';
$normCode = onlyAlphaNumWithZenkaku($rawCode);
// DB には「英数字だけ」のコードを保存しておく前提
$stmt = $pdo->prepare('SELECT * FROM coupons WHERE code = :code');
$stmt->execute([':code' => $normCode]);
PHPこうしておけば、ユーザーが "abc-123" と入力しても "ABC123" と入力しても、
同じ "ABC123" として扱えるように設計できます(大文字小文字もそろえたければ strtoupper などを組み合わせる)。
もう一歩だけ踏み込む:大文字・小文字の正規化
「英数字だけ」+「大文字に統一」の組み合わせ
英数字だけにしたあと、「大文字・小文字の違いも無視したい」ことが多いです。
例えば、クーポンコード "AbC123" と "abc123" を同じものとして扱いたい場合。
/**
* 英数字のみ抽出し、さらに大文字に統一する
*/
function normalizeAlphaNumCode(string $value): string
{
$value = onlyAlphaNumWithZenkaku($value);
return strtoupper($value);
}
PHPecho normalizeAlphaNumCode("AbC-123"); // ABC123
echo normalizeAlphaNumCode("abc123"); // ABC123
PHP「英数字だけ」+「大文字に統一」までやっておくと、
ID・コード系の比較がとても安定します。
まとめ:今日からの「英数字のみ抽出」ユーティリティ
大事なところだけ、ぎゅっとまとめます。
英数字のみ抽出は、
preg_replace('/[^A-Za-z0-9]/', '', $value)で「英数字以外を全部消す」- 日本語環境では、
mb_convert_kana(..., 'a', ...)で全角英数字を半角にしてからやる - ID・コード・クーポンなど、「英数字だけで構成されるべき値」の前処理として使う
- 必要なら、そのあと
strtoupperやstrtolowerで大文字・小文字もそろえる
核になるコードは、この2〜3個です。
function onlyAlphaNum(string $value): string
{
return preg_replace('/[^A-Za-z0-9]/', '', $value);
}
function onlyAlphaNumWithZenkaku(string $value): string
{
$value = mb_convert_kana($value, 'a', 'UTF-8');
return preg_replace('/[^A-Za-z0-9]/', '', $value);
}
function normalizeAlphaNumCode(string $value): string
{
return strtoupper(onlyAlphaNumWithZenkaku($value));
}
PHP