サブドメインに正規表現を使う

サブドメインに使えない文字列を正規表現で制限をかける

マルチテナントサービスを運営する時にサブドメインが使われることがあります。

サブドメインに使用できない文字が存在するため、バリデーションをかけるような正規表現が求められます。

admin,www,ftmなどの予約語は使えません。

ドメイン名の正規表現

 

正規表現の様々な技を駆使してサブドメインに使用することを許されていない文字にバリデーションをかけました。

具体的に下記のような制約を持った文字列にバリデーションをかけることを想定します。

  • [ ] 「"-"が連続で使われていない」
  • [ ] 「先頭で"-".””_”大文字が使われていない」
  • [ ] 「1文字以上32文字以下である」
  • [ ] 「.を不許可」
  • [ ] 「_を不許可」
  • [ ] 「半角英数字,-は使用可能」
  • [ ] 「admin www ftp mail pop smtpを使っていない」

特に、「"-"が連続で使われていない」という記述を表現することに苦戦しました。

最終的に、否定先読みという技を使用して強引に表現。

// ダブルハイフンを含まない文字列の表現
(?!.*--)

これでサブドメインに許されていない文字にActiveRecordの力を借りながらバリデーションをかけることができました。

validates :name, presence: true, exclusion: { in: %w[admin www ftp mail pop smtp] },
                   format: { with: /\\A[^-._A-Z](?!.*--)[a-z0-9\\-]{,31}\\z/ }

はじめての正規表現とベストプラクティス#4 先読みと後読みを極める|TechRacho by BPS株式会社