Laravelの文字フォーマットのバリデーションまとめ

今回は、文字フォーマットについてのバリデーションを確認します。

確認するルールはactive_urlemailipipv4ipv6mac_addressjsonurluuidulidです。

active_url | URL(アクティブ)

URLであり、ホスト部から有効なAかAAAAレコードが取得できることをチェックします。

PHP
$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での実装はこちら。

email | メールアドレス

メールアドレスの形式として正しいかをチェックします。
egulias/email-validatorのパッケージを利用してチェックします。

PHP
$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()

下記のようにすることで、適用するルールを変更できます。

PHP
$rules = ['parameter' => 'email:strict,dns'];

Laravelでの実装はこちら。

ip | IPアドレス

IPアドレスの形式として正しいかをチェックします。
IPv4、IPv6両方に対応しています。
filter_varFILTER_VALIDATE_IPの検証フィルタで検査します。

PHP
$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での実装はこちら。

ipv4 | IPv4アドレス

IPv4アドレスの形式として正しいかをチェックします。
filter_varFILTER_VALIDATE_IPの検証フィルタにFILTER_FLAG_IPV4フラグを付与して検査します。

サンプルはip | IPアドレスを参考にしてください。

Laravelでの実装はこちら。

ipv6 | IPv6アドレス

IPv6アドレスの形式として正しいかをチェックします。
filter_varFILTER_VALIDATE_IPの検証フィルタにFILTER_FLAG_IPV6フラグを付与して検査します。

サンプルはip | IPアドレスを参考にしてください。

Laravelでの実装はこちら。

mac_address | MACアドレス

MACアドレスの形式として正しいかをチェックします。
filter_varFILTER_VALIDATE_MACの検証フィルタで検査します。

PHP
$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での実装はこちら。

PHP自体のfilter_varFILTER_VALIDATE_MACの検証フィルタの実装はこちら。


実装を確認すると、下記の3パターンの時にMACアドレスとしてされます。

  1. IEEE 802フォーマット:コロンで区切られた6つの16進数
  2. IEEE 802フォーマット:ハイフンで区切られた6つの16進数
  3. EUI-64フォーマット:ドットで区切られた4つの16進数

json | JSON形式

JSON形式として正しいかをチェックします。
ざっくり書くと、json_decodeしてみて、エラーにならなければOKな感じですね。

PHP
$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での実装はこちら。

url | URL形式

URL形式として正しいかをチェックします。

PHP
$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での実装はこちら。

uuid | UUID形式

UUID形式として正しいかをチェックします。
A~F、0~9の8桁、4桁、4桁、4桁、12桁のハイフン区切りの正規表現でチェックします。

PHP
$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での実装はこちら。

文字列ヘルパの実装はこちら。

ulid | ULID形式

ULID形式として正しいかをチェックします。

PHP
$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での実装はこちら。

文字列ヘルパの実装はこちら。

Symfonyでの実装はこちら。