データベースに保存された西暦データを、Web表示用にフォーマット変換したいケースは多くあります。特に「2000」のような単年データと、「2002-2003」のような期間データが混在している場合、表示形式を統一することがユーザー体験やSEOの観点でも重要になります。本記事では、PHPの正規表現を使って、西暦データを柔軟かつ安全に置換・整形する方法を解説します。
データ構造と課題の整理
例えば、データベースのテーブルに次のような形式で西暦が保存されているとします。
| year (varchar) |
|---|
| 2000 |
| 2001 |
| 2002-2003 |
| 2003-2004 |
| 2005 |
このように「4桁の西暦のみ」と「ハイフン区切りの期間表記」が混在している場合、そのまま表示するとUIが不統一になります。特に一覧表示やアーカイブページでは、表記ゆれがUX低下の原因になります。
正規表現で実現するフォーマット変換の考え方
今回の目的は、「2002-2003」のような値を「2002/03」という形式に変換し、「2000」のような単年データはそのまま表示することです。この条件分岐をif文だけで処理するよりも、正規表現を使うことでシンプルかつ拡張性の高い実装が可能になります。
ポイントは次の2点です。
- 4桁-4桁の形式かどうかを正規表現で判定する
- 後半の西暦は下2桁だけを抽出して置換する
PHPでの実装例(preg_replace)
以下は、while文でDBデータを取得しつつ、正規表現で置換処理を行うシンプルな実装例です。
$year = $row['year'];$formatted = preg_replace('/^(\d{4})-(\d{2})\d{2}$/', '$1/$2', $year);echo htmlspecialchars($formatted, ENT_QUOTES, 'UTF-8');
この正規表現の意味は次の通りです。
- ^(\d{4}):先頭の4桁の西暦(例:2002)
- -(\d{2})\d{2}$:ハイフン+後半の西暦4桁のうち先頭2桁を取得(例:2003 → 03)
置換後の $1/$2 によって、「2002-2003」は「2002/03」に変換されます。一方、「2000」や「2005」のような単年データは正規表現にマッチしないため、そのまま表示されます。
より安全で汎用的な実装パターン
実運用では、データの揺れや不正値を考慮して、条件分岐を入れる実装も推奨されます。
$year = $row['year'];if (preg_match('/^\d{4}-\d{4}$/', $year)) { $formatted = preg_replace('/^(\d{4})-(\d{2})\d{2}$/', '$1/$2', $year);} else { $formatted = $year;}echo htmlspecialchars($formatted, ENT_QUOTES, 'UTF-8');
この方法であれば、想定外のフォーマットが来た場合でも、安全に処理できます。
実例で見る変換結果
実際の変換結果は以下のようになります。
| 元データ | 表示結果 |
|---|---|
| 2000 | 2000 |
| 2001 | 2001 |
| 2002-2003 | 2002/03 |
| 2003-2004 | 2003/04 |
| 2005 | 2005 |
このように、期間表記のみを自動的に整形できるため、一覧表示・詳細ページ・アーカイブページなど、すべてのUIで統一した表記が可能になります。
まとめ
PHPの正規表現(preg_replace)を使えば、混在する西暦データをシンプルなコードで整形できます。特に「4桁-4桁」のような期間データを「YYYY/YY」形式に変換する処理は、UIの統一性・可読性・保守性を高める上で非常に有効です。
データベース設計を変更せずに表示側でフォーマット調整できるため、既存システムにも導入しやすく、実務レベルで活用しやすいテクニックです。WordPressやPHPベースのCMS開発においても応用可能なため、ぜひ活用してみてください。


コメント