タイトルママではありますが、今日自作のRailsアプリケーションで電話番号のバリデーションを実装していました。
要件としては、以下のバリデーションルールとしました。
- 数字のみ(ハイフンは含まない)
- 10桁または11桁
インターネットの記事やGitHubを漁っていると、以下のような書き方を見かけました。
ruby
1VALID_PHONE_REGEX = /\A\d{10}$|^\d{11}\z/ 2validates :telephone, presence: true 3validates :telephone, format: {with: VALID_PHONE_REGEX}, allow_blank: true
Rubyでは^
$
の代わりに\A
\z
を使う、
(というかRubyでは^
$
は行頭行末の意味しか持たず、文字列の先頭、末尾の意味ではない)
というのは知っているのですが、実際に動かしてみると、以下のような結果となりました。
サンプルはこの記事を参考にしています。
Railsの正規表現でよく使われる \A \z って何?? - Qiita
irb(main):001:0> dangerous_phone_number = <<-TEXT irb(main):002:0" <script>alert('XSS!!');</script> irb(main):003:0" 01234567890 irb(main):004:0" TEXT => "<script>alert('XSS!!');</script>\n01234567890\n" irb(main):005:0> dangerous_phone_number =~ /\A\d{10}$|^\d{11}\z/ => nil irb(main):006:0> dangerous_phone_number =~ /\A\d{10}\z|\A\d{11}\z/ => nil irb(main):007:0> dangerous_phone_number =~ /^\d{10}$|^\d{11}$/ => 33
irb(main):006:0 と irb(main):007:0 の結果については期待通りの挙動なのですが、irb(main):005:0 の結果に少し困惑してしまいました。
(通るかなと思っていました。。。)
これはつまり改行文字の\n
がdangerous_phone_number
の最後に入ったために、^\d{11}\z
にヒットしなかった(結果はじくことができた)、ということなのでしょうか?
自分の実装では結局VALID_PHONE_REGEX = /\A\d{10}\z|\A\d{11}\z/
と書いて、一切^
$
を使わないようにしたのですが、実務でRailsを書いている方々はこのようなケースではどう書いているのでしょうか?
お手数ですが、ご回答いただけると幸いです。よろしくお願い申し上げます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。