そんなに長くない話です。
【Laravel】フリガナ入力のバリデーションのテストコード作成という記事を書いたのですが、記事中ではregex
というバリデーションルールを使用しています。
これ、内部でpreg_match関数
を使用しているみたいです。
以下、日本語ドキュメントより。
regex:正規表現
フィールドが指定された正規表現にマッチすることをバリデートします。
このルールは内部でPHPのpreg_match関数を使用しています。指定された正規表現は有効なデリミッタも含め、preg_matchで要求されているのと同じ形式に従う必要があります。たとえば、'email' => 'regex:/^.+@.+$/i'のようにです
https://readouble.com/laravel/5.8/ja/validation.html#rule-regex
なので正規表現内でひらがななどの文字を扱う際は、最後のスラッシュの後にu
をつけた方が良いです。というかつけないとバリデーションが上手くいきません。。。
regex:/^[ァ-ヶー]+$/u
で、パターン修飾子u
ってなんぞやという話になると思うのですが、PHP Manualにこう書いてありました。
u (PCRE_UTF8)
この修正子は、Perl 非互換な PCRE の機能を有効にします。パターンと対象文字列は、 UTF-8 として処理されます。 無効な対象文字列を preg_* 関数に渡しても、何もマッチしません。 無効なパターンを渡すと、E_WARNING レベルのエラーが発生します。 5オクテットおよび6オクテットの UTF-8 シーケンスは、PHP 5.3.4 以降 (PCRE 7.3 2007-08-28 以降) では無効とみなされます。 以前のバージョンでは、これらも UTF-8 として有効だとみなされていました。
https://www.php.net/manual/ja/reference.pcre.pattern.modifiers.php
ようするに、パターンと対象文字列をUTF-8として処理してくれるみたいですね。
これに気づかず30分くらい無駄な時間を過ごしました。。。