PHP Tips | 文字列処理:フォーマット – 英数字のみ抽出

PHP PHP
スポンサーリンク

「英数字のみ抽出」でやりたいことをイメージする

まず、ゴールのイメージからはっきりさせます。

"ユーザー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);
}
PHP

mb_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);
}
PHP
echo normalizeAlphaNumCode("AbC-123");     // ABC123
echo normalizeAlphaNumCode("abc123"); // ABC123
PHP

「英数字だけ」+「大文字に統一」までやっておくと、
ID・コード系の比較がとても安定します。


まとめ:今日からの「英数字のみ抽出」ユーティリティ

大事なところだけ、ぎゅっとまとめます。

英数字のみ抽出は、

  • preg_replace('/[^A-Za-z0-9]/', '', $value) で「英数字以外を全部消す」
  • 日本語環境では、mb_convert_kana(..., 'a', ...) で全角英数字を半角にしてからやる
  • ID・コード・クーポンなど、「英数字だけで構成されるべき値」の前処理として使う
  • 必要なら、そのあと strtoupperstrtolower で大文字・小文字もそろえる

核になるコードは、この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

タイトルとURLをコピーしました