はじめに
お仕事でよくLaravelを使っています。
今回絵文字(😇とか👀とか)や「𠮷」みたいな、1文字が4バイトの「サロゲートペア」を
システムから除きたい。という要件でした。
デフォルトののバリデーションで簡単に省けるかなーと思っていたら、
意外と時間がかかったので、備忘録として。
結論
先に結論を。
以下のようにカスタムバリデーターを作成しました。
|
まずはJSで
JavaScriptでサロゲートペアを弾くロジックを、プロジェクトメンバーが教えてくれました。
|
Array.from()でサロゲートペアを配列に変換し、文字数をカウント。
JavaScriptのArray.from()では、サロゲートペアの文字列も一文字として扱ってくれるみたいです。
|
string.lengthではbyte数が表示されます。
|
この出力が異なる場合はサロゲートペアということですね。
これをphpで記述すればいいわけです。
phpで書く
まず、文字数を数えるのはmb_strlen($value)を使います。
|
次にbyte数を数えます。
JSのstring.lengthをphpでどう書くか、いろいろ調べてみると、こんな記事が
JavaScriptのString.lengthをPHPで実装する
この記事を参考に以下のように実装しました。
|
byte数が出力されましたね。
この二つの値を比較すると、チェックが可能です。
これで、最終的なコードができました
|
サロゲートペアの場合、falseを返します。
最後に
あとは、Laravelのカスタムバリデーションを用いて実装するだけですね。
以上、サロゲートペアのバリデーションに関する記事でした。
最後まで読んでいただき、ありがとうございました!
株式会社Fusicでは一緒に働くエンジニアを募集しています!
福岡での就職・転職に少しでも興味のある方は、
ayasamind宛のDM、Fusic公式サイトのお問い合わせなど、お気軽にご相談ください。