Blog Post - 4. Oktober 2015
Youtube URLs mit Embeds ersetzen [Rails]

Youtube URLs mit Embeds ersetzen [Rails]

Eine einfache Möglichkeit um das Einbinden von Youtube-Videos in Beiträge oder Kommentare einzubinden ist das automatische Umwandeln von Youtube-Links in entsprechende Emebed-Codes.

Um die Youtube-Link uwmandeln zu können, müssen sie zunächst über eine Regular Expression im Inhalt ausfindig gemacht werden. Dafür gibt es einen sehr guten Regex ridgerunner bei Stackoverflow (Quelle), welcher sich mit einer kleinen Anpassung auch in Ruby verwenden lässt. Im Original exitsiert noch ein g-Flag, welcher in Rails in dieser Form nicht unterstützt wird.

String.match(/https?:\/\/(?:[0-9A-Z-]+\.)?(?:youtu\.be\/|youtube(?:-nocookie)?\.com\S*[^\w\s-])([\w-]{11})(?=[^\w-]|$)(?![?=&+%\w.-]*(?:['"][^<>]*>|<\/a>))[?=&+%\w.-]*/i)

Nun kann mit einem weiteren Regex die Youtube-ID extrahiert und die ganze URL mit einem Emebed ersetzt werden. Wieder von Stackoverflow aber dieses mal von Douglas F Shearer (Quelle) kommt dafür folgender Regex zum Einsatz:

Url.match(/(?:.be\/|\/watch\?v=|\/(?=p\/))([\w\/\-]+)/)[1]

Beide Funktionen können über zwei Helper miteinander kombiniert werden, welche dann so eingsetzt werden können replace_yt_urls(String). def replace_yt_urls(text) text.gsub!(/https?:\/\/(?:[0-9A-Z-]+\.)?(?:youtu\.be\/|youtube(?:-nocookie)?\.com\S*[^\w\s-])([\w-]{11})(?=[^\w-]|$)(?![?=&+%\w.-]*(?:['"][^<>]*>|<\/a>))[?=&+%\w.-]*/i) do |url| extract_id_and_replace_yt_url(url) end text.html_safe end def extract_id_and_replace_yt_url(url) video_id = url.match(/(?:.be\/|\/watch\?v=|\/(?=p\/))([\w\/\-]+)/)[1] "

" end