拆分youtube url rails

时间:2016-10-22 21:51:21

标签: ruby-on-rails ruby parsing youtube

我试图解析youtube网址。目前我的代码可以使用标准的YouTube网址。

https://www.youtube.com/watch?v=tYMFIIVOHyo

但是不要使用list或youtu.be喜欢这个

https://www.youtube.com/watch?v=tYMFIIVOHyo&list=UUH3V-b6weBfTrDuyJgFioOw
https://youtu.be/tYMFIIVOHyo?list=UUH3V-b6weBfTrDuyJgFioOw
https://youtu.be/tYMFIIVOHyo

我的代码是

module CampingsHelper
  def embed(youtube_url)
   youtube_id = youtube_url.split("=").last
   content_tag(:iframe, nil, src: "//www.youtube.com/embed/#{youtube_id}")
 end

我如何解决这个问题?

顺便提一下,如果网址不是来自youtube,我想显示提醒。

2 个答案:

答案 0 :(得分:2)

你的代码没有做正确的事情,那就是使用Ruby附带的现有轮子URI

require 'uri'

uri = URI.parse('https://www.youtube.com/watch?v=tYMFIIVOHyo&list=UUH3V-b6weBfTrDuyJgFioOw')
uri.host # => "www.youtube.com"
uri.query # => "v=tYMFIIVOHyo&list=UUH3V-b6weBfTrDuyJgFioOw"
uri.query && URI.decode_www_form(uri.query).to_h # => {"v"=>"tYMFIIVOHyo", "list"=>"UUH3V-b6weBfTrDuyJgFioOw"}
uri.query && URI.decode_www_form(uri.query).to_h['list'] # => "UUH3V-b6weBfTrDuyJgFioOw"

uri = URI.parse('https://youtu.be/tYMFIIVOHyo?list=UUH3V-b6weBfTrDuyJgFioOw')
uri.host # => "youtu.be"
uri.query # => "list=UUH3V-b6weBfTrDuyJgFioOw"
uri.query && URI.decode_www_form(uri.query).to_h # => {"list"=>"UUH3V-b6weBfTrDuyJgFioOw"}
uri.query && URI.decode_www_form(uri.query).to_h['list'] # => "UUH3V-b6weBfTrDuyJgFioOw"

uri = URI.parse('https://youtu.be/tYMFIIVOHyo')
uri.host # => "youtu.be"
uri.query # => nil
uri.query && URI.decode_www_form(uri.query).to_h # => nil
uri.query && URI.decode_www_form(uri.query).to_h['list'] # => nil

URI了解规范并拥有可轻松拆分和构建URI的工具。你可以尝试建立自己的,但很有可能你会错过一些东西,所以要充分利用经过充分测试的图书馆。

答案 1 :(得分:1)

您可以使用正则表达式:

youtube_id = youtube_url[/(?<=v=)[^&]+|(?<=https:\/\/youtu.be\/)[^&?]+/]

要显示提醒,只需检查该网址是否以https://www.youtube.comhttps://youtube.comhttps://youtu.be

开头