YouTubeのURLのみ登録を許可する正規表現を設定してみた【Ruby】


環境

ruby 2.6.5
rails 6.0.3

前置き

今回実装したかった仕様はYouTubeの動画をユーザーが登録すること
その際にYouTube以外の動画サイトのURLを登録されると色々不都合が出てくるので
ユーザーが登録する動画URLはYouTubeのURLだけに限定したい

YouTubeのURLの特徴としては以下の2点

なので今回はこの2点を考慮してYouTubeのURLを判定する正規表現を作成していく

正規表現

そして完成したのがこちらのvalidation

app/models/exercise.rb
validates :url, presence: true,
                  format: { with: /\A(https\:\/\/)?(www\.)?(youtube\.com\/watch\?v=|youtu\.be\/)+[\S]{11}\z/ }

正規表現だけ抜き出すとこんな感じ

/\A(https\:\/\/)?(www\.)?(youtube\.com\/watch\?v=|youtu\.be\/)+[\S]{11}\z/

これでYouTubeのURLのみデータベースに保存することが可能です。
rubyの場合はRubularというサイトで正規表現のチェックを行えます。

ブラウザでの表示

ちなみに以下のようにすることでブラウザで動画を表示させる事が可能です。

app/views/exercise/exercise.html.erb
<iframe width="560" height="315" src="https://www.youtube.com/embed/<%= @exercise.url.last(11) %>"
        frameborder="0" allow="accelerometer; autoplay; encrypted-media;
        gyroscope; picture-in-picture" allowfullscreen>
</iframe>
app/controllers/exercise_controller.rb
@exercise = Exercise.find(params[:id])

最後に

もうすこしうまく正規表現を書けば、最後の11文字だけを抽出して登録した方がいいかもです。
そうするとブラウザに表示するときに.last(11)が不要になるので。
私はここまでかなり苦戦したので余力がありませんでした・・・笑
時間がある時にまた考えてみようと思います。

あと実は他にもYouTubeのURLの形式って色々あります。
下記のように再生リストのURLだと全然形式違ったり・・・
https://www.youtube.com/watch?v=APdS9YQUWro&list=RDVFdLm6gEEE4&start_radio=1
検証段階で他にも確か全然違うURLがあったりとしましたが大変なので今回はメイン2種類に絞りました。