はじめに

Laravel で 全角カタカナ・半角英数記号 に変換しつつバリデーションする方法について整理した。

要件としては下記。

  • バリデーションの前にデータを変換
    • 「全角かな・半角カナ」→「全角カナ」
    • 「全角英数記号」→「半角英数記号」
  • 変換したデータに対してバリデーション
    • バリデーション OK ならその後の処理も変換後のデータを利用
      • レコードの 作成/更新 とか検索とか

TL;DR

  • prepareForValidation でバリデーション前の処理
    • mb_convert_kana で全角・半角の変換
      • 変換できない文字もあるので注意
  • regex ルールで正規表現を使ってバリデーション
    • バリデーション通れば後はいつも通り

目次

  1. はじめに
  2. TL;DR
  3. 環境・条件
  4. 詳細
    1. 要件(やりたいこと)
    2. 解決方法
      1. 全角カナや半角英数記号で DB レコードを作りたい
      2. 変換したデータに対して、バリデーションも行いたい
    3. 最終形(再掲)
  5. まとめ
  6. その他・メモ
  7. 参考文献

環境・条件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ sw_vers
ProductName: Mac OS X
ProductVersion: 10.15.1
BuildVersion: 19B88

$ php -v
PHP 7.3.9 (cli) (built: Sep 10 2019 17:45:01) ( NTS )

$ composer -V
Composer version 1.9.0 2019-08-02 20:55:32

$ composer info laravel/framework
name : laravel/framework
versions : * v5.7.28

詳細

要件(やりたいこと)

  • 全角カナや半角英数記号で DB レコードを作りたい
    • ユーザー入力ミスもある程度救済してあげたい
      • 「全角かな・半角カナ」で入力された分は「全角カナ」に変換
      • 「全角英数記号」で入力された分は「半角英数記号」に変換
  • 変換したデータに対して、バリデーションも行いたい
    • バリデーション OK ならその後の処理に移行

解決方法

最終形はこちら。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class HogeRequest extends FormRequest
{
public function rules()
{
return [
'kana' => 'required|string|regex:/^[ァ-ヾ 〜ー]+$/u',
'english' => 'required|string|regex:/^[!-~ ¥]+$/u',
];
}

public function prepareForValidation()
{
// 半角→全角 カナ
$this->merge(['kana' => mb_convert_kana($this->kana, 'KCSA')]);

// 全角→半角 英数(※変換できないものもあるので注意)
$this->merge(['english' => mb_convert_kana($this->english, 'as')]);
}
}

それぞれ分解して説明。

全角カナや半角英数記号で DB レコードを作りたい

prepareForValidation で、Validation 実行前に前処理を行うことができる。

参考: Laravel でコンマ区切りのフォームデータを良い感じにバリデーションする

ここで mb_convert_kana を使って、データの変換を行う。


PHP: mb_convert_kana - Manual より

1
2
3
4
5
6
7
8
public function prepareForValidation()
{
// 半角→全角 カナ
$this->merge(['kana' => mb_convert_kana($this->kana, 'KCSA')]);

// 全角→半角 英数(※変換できないものもあるので注意)
$this->merge(['english' => mb_convert_kana($this->english, 'as')]);
}

なお、ここで $this->kana = mb_convert_kana($this->kana, 'KCSA'); としても、バリデーション時には反映されていないので注意。
merge 以外に良いやり方があったら知りたい。

注意点: 変換できない文字

コメントにも書いてるが、一部の記号などは mb_convert_kana では変換されないので注意。

ちゃんとやるなら、str_replace, preg_replace も併用する必要がある。

下記記事が参考になると思われる。

変換したデータに対して、バリデーションも行いたい

今回の要件は「『全角カナ』や『半角英数記号』で DB レコードを作りたい」であり、alpha_num などではカバーできないため、正規表現 regex でバリデーションをかける。

1
2
3
4
5
6
7
public function rules()
{
return [
'kana' => 'required|string|regex:/^[ァ-ヾ 〜ー]+$/u',
'english' => 'required|string|regex:/^[!-~ ¥]+$/u',
];
}

最終形(再掲)

というわけでまとめると下記。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class HogeRequest extends FormRequest
{
public function rules()
{
return [
'kana' => 'required|string|regex:/^[ァ-ヾ 〜ー]+$/u',
'english' => 'required|string|regex:/^[!-~ ¥]+$/u',
];
}

public function prepareForValidation()
{
// 半角→全角 カナ
$this->merge(['kana' => mb_convert_kana($this->kana, 'KCSA')]);

// 全角→半角 英数(※変換できないものもあるので注意)
$this->merge(['english' => mb_convert_kana($this->english, 'as')]);
}
}

まとめ

  • prepareForValidation でバリデーション前の処理
    • mb_convert_kana で全角・半角の変換
      • 変換できない文字もあるので注意
  • regex ルールで正規表現を使ってバリデーション
    • バリデーション通れば後はいつも通り

その他・メモ

PHP, Laravel 初心者なので、他に最適解があるかも。鵜呑みにしないこと。

参考文献

関連記事