Laravel バリデーションについてまとめていくよ3(数値)に続いてlaravelのバリデーションをまとめていきます。
今回は、文字フォーマットについてのバリデーションを確認します。
確認するルールはactive_url
、email
、ip
、ipv4
、ipv6
、mac_address
、json
、url
、uuid
、ulid
です。
記事の目次
active_url | URL(アクティブ)
URLであり、ホスト部から有効なAかAAAAレコードが取得できることをチェックします。
$rules = ['parameter' => 'active_url']; // リクエストにパラメーターが含まれていない $data = []; Validator::make($data, $rules)->passes(); // true // null $data = ['parameter' => null]; Validator::make($data, $rules)->passes(); // false // 空文字 $data = ['parameter' => '']; Validator::make($data, $rules)->passes(); // true // 半角スペース $data = ['parameter' => ' ']; Validator::make($data, $rules)->passes(); // false // 空配列 $data = ['parameter' => []]; Validator::make($data, $rules)->passes(); // false // URLとして有効 $data = ['parameter' => 'https://webspace.jp']; Validator::make($data, $rules)->passes(); // true // URLとして有効 $data = ['parameter' => 'https://webspace.jp/path']; Validator::make($data, $rules)->passes(); // true // URLとして有効 $data = ['parameter' => 'https://webspace.jp:80/']; Validator::make($data, $rules)->passes(); // true // URLとして有効 $data = ['parameter' => '//webspace.jp']; Validator::make($data, $rules)->passes(); // true // ダメな例 $data = ['parameter' => '/webspace.jp']; Validator::make($data, $rules)->passes(); // false // ダメな例 $data = ['parameter' => 'webspace.jp']; Validator::make($data, $rules)->passes(); // false // 存在しないホスト部 $data = ['parameter' => 'http://username:password@hostname:9090/path?arg=value#anchor']; Validator::make($data, $rules)->passes(); // false
AかAAAAレコードを取得するため存在しないドメインの場合、DNS取得に時間がかかることがあります。
Laravelでの実装はこちら。
https://github.com/laravel/framework/blob/v9.45.1/src/Illuminate/Validation/Concerns/ValidatesAttributes.php#L105-L131
email | メールアドレス
メールアドレスの形式として正しいかをチェックします。
egulias/email-validatorのパッケージを利用してチェックします。
$rules = ['parameter' => 'email']; // リクエストにパラメーターが含まれていない $data = []; Validator::make($data, $rules)->passes(); // true // null $data = ['parameter' => null]; Validator::make($data, $rules)->passes(); // false // 空文字 $data = ['parameter' => '']; Validator::make($data, $rules)->passes(); // true // 半角スペース $data = ['parameter' => ' ']; Validator::make($data, $rules)->passes(); // true // 空配列 $data = ['parameter' => []]; Validator::make($data, $rules)->passes(); // false // メールアドレス $data = ['parameter' => 'hoge@webspace.jp']; Validator::make($data, $rules)->passes(); // true // メールアドレス(複数) $data = ['parameter' => 'hoge@webspace.jp,huga@webspace.jp']; Validator::make($data, $rules)->passes(); // false // メールアドレス(名前付き) $data = ['parameter' => 'hukinotou <hoge@webspace.jp>']; Validator::make($data, $rules)->passes(); // false // 文字列 $data = ['parameter' => 'hoge@']; Validator::make($data, $rules)->passes(); // false // 文字列 $data = ['parameter' => '@webspace.jp']; Validator::make($data, $rules)->passes(); // false
デフォルトではRFCValidation
が適用されます。
パラメータを設定することで、異なるルールでチェックをすることができます。
- rfc: RFCValidation
- strict: NoRFCWarningsValidation
- dns: DNSCheckValidation
- spoof: SpoofCheckValidation
- filter: FilterEmailValidation
- filter_unicode: FilterEmailValidation::unicode()
下記のようにすることで、適用するルールを変更できます。
$rules = ['parameter' => 'email:strict,dns'];
Laravelでの実装はこちら。
https://github.com/laravel/framework/blob/v9.45.1/src/Illuminate/Validation/Concerns/ValidatesAttributes.php#L778-L807
ip | IPアドレス
IPアドレスの形式として正しいかをチェックします。
IPv4、IPv6両方に対応しています。
filter_var
のFILTER_VALIDATE_IP
の検証フィルタで検査します。
$rules = ['parameter' => 'ip']; // リクエストにパラメーターが含まれていない $data = []; Validator::make($data, $rules)->passes(); // true // null $data = ['parameter' => null]; Validator::make($data, $rules)->passes(); // false // 空文字 $data = ['parameter' => '']; Validator::make($data, $rules)->passes(); // true // 半角スペース $data = ['parameter' => ' ']; Validator::make($data, $rules)->passes(); // true // 空配列 $data = ['parameter' => []]; Validator::make($data, $rules)->passes(); // false // IPアドレス(IPv4:ループバックアドレス) $data = ['parameter' => '127.0.0.1']; Validator::make($data, $rules)->passes(); // true // IPアドレス(IPv4) $data = ['parameter' => '192.0.2.128']; Validator::make($data, $rules)->passes(); // true // IPアドレス(IPv6:ループバックアドレス) $data = ['parameter' => '::1']; Validator::make($data, $rules)->passes(); // true // IPアドレス(IPv6:未定義アドレス) $data = ['parameter' => '::']; Validator::make($data, $rules)->passes(); // true // IPアドレス(IPv6) $data = ['parameter' => '2001:db8:85a3::8a2e:370:7334']; Validator::make($data, $rules)->passes(); // true // IPアドレス(IPv4互換アドレス) $data = ['parameter' => '::ffff:192.0.2.128']; Validator::make($data, $rules)->passes(); // true // エラー値(255を超えた値[256]) $data = ['parameter' => '255.255.255.256']; Validator::make($data, $rules)->passes(); // false // エラー値(桁不足) $data = ['parameter' => '240.0.0.']; Validator::make($data, $rules)->passes(); // false // エラー値(0xf を超えた値[0xg]) $data = ['parameter' => 'g001:db8:85a3::8a2e:370:7334']; Validator::make($data, $rules)->passes(); // false
Laravelでの実装はこちら。
https://github.com/laravel/framework/blob/v9.45.1/src/Illuminate/Validation/Concerns/ValidatesAttributes.php#L1299-L1309
ipv4 | IPv4アドレス
IPv4アドレスの形式として正しいかをチェックします。
filter_var
のFILTER_VALIDATE_IP
の検証フィルタにFILTER_FLAG_IPV4
フラグを付与して検査します。
サンプルはip | IPアドレスを参考にしてください。
Laravelでの実装はこちら。
https://github.com/laravel/framework/blob/v9.45.1/src/Illuminate/Validation/Concerns/ValidatesAttributes.php#L1311-L1321
ipv6 | IPv6アドレス
IPv6アドレスの形式として正しいかをチェックします。
filter_var
のFILTER_VALIDATE_IP
の検証フィルタにFILTER_FLAG_IPV6
フラグを付与して検査します。
サンプルはip | IPアドレスを参考にしてください。
Laravelでの実装はこちら。
https://github.com/laravel/framework/blob/v9.45.1/src/Illuminate/Validation/Concerns/ValidatesAttributes.php#L1323-L1333
mac_address | MACアドレス
MACアドレスの形式として正しいかをチェックします。
filter_var
のFILTER_VALIDATE_MAC
の検証フィルタで検査します。
$rules = ['parameter' => 'mac_address']; // リクエストにパラメーターが含まれていない $data = []; Validator::make($data, $rules)->passes(); // true // null $data = ['parameter' => null]; Validator::make($data, $rules)->passes(); // false // 空文字 $data = ['parameter' => '']; Validator::make($data, $rules)->passes(); // true // 半角スペース $data = ['parameter' => ' ']; Validator::make($data, $rules)->passes(); // true // 空配列 $data = ['parameter' => []]; Validator::make($data, $rules)->passes(); // false // 有効なMACアドレス(コロンで区切られた6つの16進数(IEEE 802フォーマット)) $data = ['parameter' => '00:00:5e:00:53:00']; Validator::make($data, $rules)->passes(); // true // 有効なMACアドレス(ハイフンで区切られた6つの16進数(IEEE 802フォーマット)) $data = ['parameter' => '00-00-5e-00-53-00']; Validator::make($data, $rules)->passes(); // true // 有効なMACアドレス(ドットで区切られた4つの16進数(EUI-64フォーマット)) $data = ['parameter' => '0000.5e00.5300']; Validator::make($data, $rules)->passes(); // true // エラー値(桁不足) $data = ['parameter' => '00:00:5e:00:53']; Validator::make($data, $rules)->passes(); // false // エラー値(0xf を超えた値[0xg]) $data = ['parameter' => 'g0:00:5e:00:53:00']; Validator::make($data, $rules)->passes(); // false
Laravelでの実装はこちら。
https://github.com/laravel/framework/blob/v9.45.1/src/Illuminate/Validation/Concerns/ValidatesAttributes.php#L1335-L1345
PHP自体のfilter_var
のFILTER_VALIDATE_MAC
の検証フィルタの実装はこちら。
https://github.com/php/php-src/blob/PHP-8.2.0/ext/filter/logical_filters.c#L976-L1036
実装を確認すると、下記の3パターンの時にMACアドレスとしてされます。
- IEEE 802フォーマット:コロンで区切られた6つの16進数
- IEEE 802フォーマット:ハイフンで区切られた6つの16進数
- EUI-64フォーマット:ドットで区切られた4つの16進数
json | JSON形式
JSON形式として正しいかをチェックします。
ざっくり書くと、json_decode
してみて、エラーにならなければOKな感じですね。
$rules = ['parameter' => 'json']; // リクエストにパラメーターが含まれていない $data = []; Validator::make($data, $rules)->passes(); // true // null $data = ['parameter' => null]; Validator::make($data, $rules)->passes(); // false // 空文字 $data = ['parameter' => '']; Validator::make($data, $rules)->passes(); // true // 半角スペース $data = ['parameter' => ' ']; Validator::make($data, $rules)->passes(); // true // 空配列 $data = ['parameter' => []]; Validator::make($data, $rules)->passes(); // false // 整数(文字列) $data = ['parameter' => '3']; Validator::make($data, $rules)->passes(); // true // マイナス(文字列) $data = ['parameter' => '-3']; Validator::make($data, $rules)->passes(); // true // プラス(文字列) $data = ['parameter' => '+3']; Validator::make($data, $rules)->passes(); // false // 小数(文字列) $data = ['parameter' => '1.8']; Validator::make($data, $rules)->passes(); // true // 整数 $data = ['parameter' => 3]; Validator::make($data, $rules)->passes(); // true // マイナス $data = ['parameter' => -3]; Validator::make($data, $rules)->passes(); // true // 小数 $data = ['parameter' => 1.8]; Validator::make($data, $rules)->passes(); // true // bool(true) $data = ['parameter' => true]; Validator::make($data, $rules)->passes(); // true // bool(false) $data = ['parameter' => false]; Validator::make($data, $rules)->passes(); // false // bool(true)(文字列) $data = ['parameter' => 'true']; Validator::make($data, $rules)->passes(); // true // bool(false)(文字列) $data = ['parameter' => 'false']; Validator::make($data, $rules)->passes(); // true // JSON形式(オブジェクト形式) $data = ['parameter' => '{"hoge": "huga"}']; Validator::make($data, $rules)->passes(); // true // JSON形式(オブジェクト形式) $data = ['parameter' => '{"hoge": 1}']; Validator::make($data, $rules)->passes(); // true // JSON形式(配列形式) $data = ['parameter' => '["hoge", "huga"]']; Validator::make($data, $rules)->passes(); // true // JSON形式(配列形式) $data = ['parameter' => '[1, 2]']; Validator::make($data, $rules)->passes(); // true // エラー値(オブジェクトのキー名が"で囲まれていない) $data = ['parameter' => '{hoge: "huga"}']; Validator::make($data, $rules)->passes(); // false
Laravelでの実装はこちら。
https://github.com/laravel/framework/blob/v9.45.1/src/Illuminate/Validation/Concerns/ValidatesAttributes.php#L1347-L1367
url | URL形式
URL形式として正しいかをチェックします。
$rules = ['parameter' => 'url']; // リクエストにパラメーターが含まれていない $data = []; Validator::make($data, $rules)->passes(); // true // null $data = ['parameter' => null]; Validator::make($data, $rules)->passes(); // false // 空文字 $data = ['parameter' => '']; Validator::make($data, $rules)->passes(); // true // 半角スペース $data = ['parameter' => ' ']; Validator::make($data, $rules)->passes(); // true // 空配列 $data = ['parameter' => []]; Validator::make($data, $rules)->passes(); // false // 整数(文字列) $data = ['parameter' => '3']; Validator::make($data, $rules)->passes(); // false // マイナス(文字列) $data = ['parameter' => '-3']; Validator::make($data, $rules)->passes(); // false // プラス(文字列) $data = ['parameter' => '+3']; Validator::make($data, $rules)->passes(); // false // 小数(文字列) $data = ['parameter' => '1.8']; Validator::make($data, $rules)->passes(); // false // 整数 $data = ['parameter' => 3]; Validator::make($data, $rules)->passes(); // false // マイナス $data = ['parameter' => -3]; Validator::make($data, $rules)->passes(); // false // 小数 $data = ['parameter' => 1.8]; Validator::make($data, $rules)->passes(); // false // bool(true) $data = ['parameter' => true]; Validator::make($data, $rules)->passes(); // false // bool(false) $data = ['parameter' => false]; Validator::make($data, $rules)->passes(); // false // bool(true)(文字列) $data = ['parameter' => 'true']; Validator::make($data, $rules)->passes(); // false // bool(false)(文字列) $data = ['parameter' => 'false']; Validator::make($data, $rules)->passes(); // false // url(ドメインのみ) $data = ['parameter' => 'https://webspace.jp/']; Validator::make($data, $rules)->passes(); // true // url(ドメインのみ:末尾のスラッシュなし) $data = ['parameter' => 'https://webspace.jp']; Validator::make($data, $rules)->passes(); // true // url(Basic認証つき) $data = ['parameter' => 'https://hoge:huga@webspace.jp/']; Validator::make($data, $rules)->passes(); // true // url(ポート番号つき) $data = ['parameter' => 'https://webspace.jp:443/']; Validator::make($data, $rules)->passes(); // true // url(パスつき) $data = ['parameter' => 'https://webspace.jp/path/']; Validator::make($data, $rules)->passes(); // true // url(クエリーパラメーターつき) $data = ['parameter' => 'https://webspace.jp/?query=piyo']; Validator::make($data, $rules)->passes(); // true // url(フラグメントつき) $data = ['parameter' => 'https://webspace.jp/#hogehoge']; Validator::make($data, $rules)->passes(); // true // url(全部つき) $data = ['parameter' => 'https://hoge:huga@webspace.jp:443/path/?query=piyo#hogehoge']; Validator::make($data, $rules)->passes(); // true // url(IPアドレス) $data = ['parameter' => 'http://127.0.0.1/']; Validator::make($data, $rules)->passes(); // true
Laravelでの実装はこちら。
https://github.com/laravel/framework/blob/v9.45.1/src/Illuminate/Validation/Concerns/ValidatesAttributes.php#L2145-L2182
uuid | UUID形式
UUID形式として正しいかをチェックします。
A~F、0~9の8桁、4桁、4桁、4桁、12桁のハイフン区切りの正規表現でチェックします。
$rules = ['parameter' => 'uuid']; // リクエストにパラメーターが含まれていない $data = []; Validator::make($data, $rules)->passes(); // true // null $data = ['parameter' => null]; Validator::make($data, $rules)->passes(); // false // 空文字 $data = ['parameter' => '']; Validator::make($data, $rules)->passes(); // true // 半角スペース $data = ['parameter' => ' ']; Validator::make($data, $rules)->passes(); // true // 空配列 $data = ['parameter' => []]; Validator::make($data, $rules)->passes(); // false // 整数(文字列) $data = ['parameter' => '3']; Validator::make($data, $rules)->passes(); // false // マイナス(文字列) $data = ['parameter' => '-3']; Validator::make($data, $rules)->passes(); // false // プラス(文字列) $data = ['parameter' => '+3']; Validator::make($data, $rules)->passes(); // false // 小数(文字列) $data = ['parameter' => '1.8']; Validator::make($data, $rules)->passes(); // false // 整数 $data = ['parameter' => 3]; Validator::make($data, $rules)->passes(); // false // マイナス $data = ['parameter' => -3]; Validator::make($data, $rules)->passes(); // false // 小数 $data = ['parameter' => 1.8]; Validator::make($data, $rules)->passes(); // false // bool(true) $data = ['parameter' => true]; Validator::make($data, $rules)->passes(); // false // bool(false) $data = ['parameter' => false]; Validator::make($data, $rules)->passes(); // false // bool(true)(文字列) $data = ['parameter' => 'true']; Validator::make($data, $rules)->passes(); // false // bool(false)(文字列) $data = ['parameter' => 'false']; Validator::make($data, $rules)->passes(); // false // UUID(小文字) $data = ['parameter' => '75e9d34d-15a0-4002-7ae0-95b0ae18d61f']; Validator::make($data, $rules)->passes(); // true // UUID(大文字) $data = ['parameter' => '5664B42E-2747-4C4C-3DC7-236040D7470B']; Validator::make($data, $rules)->passes(); // true
Laravelでの実装はこちら。
https://github.com/laravel/framework/blob/v9.45.1/src/Illuminate/Validation/Concerns/ValidatesAttributes.php#L2196-L2206
文字列ヘルパの実装はこちら。
https://github.com/laravel/framework/blob/v9.45.1/src/Illuminate/Support/Str.php#L426-L439
ulid | ULID形式
ULID形式として正しいかをチェックします。
$rules = ['parameter' => 'ulid']; // リクエストにパラメーターが含まれていない $data = []; Validator::make($data, $rules)->passes(); // true // null $data = ['parameter' => null]; Validator::make($data, $rules)->passes(); // false // 空文字 $data = ['parameter' => '']; Validator::make($data, $rules)->passes(); // true // 半角スペース $data = ['parameter' => ' ']; Validator::make($data, $rules)->passes(); // true // 空配列 $data = ['parameter' => []]; Validator::make($data, $rules)->passes(); // false // 整数(文字列) $data = ['parameter' => '3']; Validator::make($data, $rules)->passes(); // false // マイナス(文字列) $data = ['parameter' => '-3']; Validator::make($data, $rules)->passes(); // false // プラス(文字列) $data = ['parameter' => '+3']; Validator::make($data, $rules)->passes(); // false // 小数(文字列) $data = ['parameter' => '1.8']; Validator::make($data, $rules)->passes(); // false // 整数 $data = ['parameter' => 3]; Validator::make($data, $rules)->passes(); // false // マイナス $data = ['parameter' => -3]; Validator::make($data, $rules)->passes(); // false // 小数 $data = ['parameter' => 1.8]; Validator::make($data, $rules)->passes(); // false // bool(true) $data = ['parameter' => true]; Validator::make($data, $rules)->passes(); // false // bool(false) $data = ['parameter' => false]; Validator::make($data, $rules)->passes(); // false // bool(true)(文字列) $data = ['parameter' => 'true']; Validator::make($data, $rules)->passes(); // false // bool(false)(文字列) $data = ['parameter' => 'false']; Validator::make($data, $rules)->passes(); // false // ULID(小文字) $data = ['parameter' => '01arz3ndektsv4rrffq69g5fav']; Validator::make($data, $rules)->passes(); // true // ULID(大文字) $data = ['parameter' => '01ARZ3NDEKTSV4RRFFQ69G5FAV']; Validator::make($data, $rules)->passes(); // true // ULIDっぽい文字列(ULIDにはI, L, Oは利用されない) $data = ['parameter' => '01ARZ3NDEKTSV4RRFFQ69G5FAL']; Validator::make($data, $rules)->passes(); // false
Laravelでの実装はこちら。
https://github.com/laravel/framework/blob/v9.45.1/src/Illuminate/Validation/Concerns/ValidatesAttributes.php#L2184-L2194
文字列ヘルパの実装はこちら。
https://github.com/laravel/framework/blob/v9.45.1/src/Illuminate/Support/Str.php#L441-L454
Symfonyでの実装はこちら。
https://github.com/symfony/uid/blob/6.3/Ulid.php#L46-L57