Laravel で 全角カタカナ・半角英数記号 に変換しつつバリデーション
はじめに
Laravel で 全角カタカナ・半角英数記号 に変換しつつバリデーションする方法について整理した。
要件としては下記。
- バリデーションの前にデータを変換
- 「全角かな・半角カナ」→「全角カナ」
- 「全角英数記号」→「半角英数記号」
- 変換したデータに対してバリデーション
- バリデーション OK ならその後の処理も変換後のデータを利用
- レコードの 作成/更新 とか検索とか
- バリデーション OK ならその後の処理も変換後のデータを利用
TL;DR
prepareForValidation
でバリデーション前の処理mb_convert_kana
で全角・半角の変換- 変換できない文字もあるので注意
regex
ルールで正規表現を使ってバリデーション- バリデーション通れば後はいつも通り
目次
環境・条件
1 | $ sw_vers |
詳細
要件(やりたいこと)
- 全角カナや半角英数記号で DB レコードを作りたい
- ユーザー入力ミスもある程度救済してあげたい
- 「全角かな・半角カナ」で入力された分は「全角カナ」に変換
- 「全角英数記号」で入力された分は「半角英数記号」に変換
- ユーザー入力ミスもある程度救済してあげたい
- 変換したデータに対して、バリデーションも行いたい
- バリデーション OK ならその後の処理に移行
解決方法
最終形はこちら。
1 |
|
それぞれ分解して説明。
全角カナや半角英数記号で DB レコードを作りたい
- 以下の 2つを組み合わせて解決する
prepareForValidation
で、Validation 実行前に前処理を行うことができる。
参考: Laravel でコンマ区切りのフォームデータを良い感じにバリデーションする
ここで mb_convert_kana
を使って、データの変換を行う。
1 | public function prepareForValidation() |
なお、ここで $this->kana = mb_convert_kana($this->kana, 'KCSA');
としても、バリデーション時には反映されていないので注意。
※merge
以外に良いやり方があったら知りたい。
注意点: 変換できない文字
コメントにも書いてるが、一部の記号などは mb_convert_kana
では変換されないので注意。
ちゃんとやるなら、str_replace
, preg_replace
も併用する必要がある。
下記記事が参考になると思われる。
変換したデータに対して、バリデーションも行いたい
今回の要件は「『全角カナ』や『半角英数記号』で DB レコードを作りたい」であり、alpha_num
などではカバーできないため、正規表現 regex
でバリデーションをかける。
1 | public function rules() |
最終形(再掲)
というわけでまとめると下記。
1 |
|
まとめ
prepareForValidation
でバリデーション前の処理mb_convert_kana
で全角・半角の変換- 変換できない文字もあるので注意
regex
ルールで正規表現を使ってバリデーション- バリデーション通れば後はいつも通り
その他・メモ
PHP, Laravel 初心者なので、他に最適解があるかも。鵜呑みにしないこと。
参考文献
- バリデーション 5.8 Laravel
- prepareForValidation - Illuminate\Validation\ValidatesWhenResolvedTrait | Laravel API
- PHP関数 - 半角 ⇔ 全角 変換 - mb_convert_kana() - PHP入門のカルマ
- 【laravel】5.4 よく使いそうなバリデータ - Qiita
- PHP: mb_convert_kana - Manual
- 今更ながら「mb_convert_kana」の変換する文字列の範囲について調べてみました - Qiita
- 【php】mb_convert_kana()で変換されない文字 at softelメモ
関連記事
- Laravel で現在の URL 取得方法まとめ
- Laravel で Cookie を使う(参照/設定/削除)
- Laravel で PDF ファイルをブラウザで開く
- Laravel で withCount と having を使って絞り込み
- Laravel で「開始日時 < 終了日時」であることをバリデーションする
- Laravel で生 SQL を実行
- JavaScript で URL のクエリパラメータを操作する方法
- jQuery Select2 で、初期値の設定と選択状態のクリア