ruby-on-rails - 解析 youtube 网址

标签 ruby-on-rails ruby url

我写了一个 ruby​​ youtube url 解析器。它旨在接受以下结构之一的 youtube url 输入(这些是目前我能找到的 youtube url 结构,也许还有更多?):

http://youtu.be/sGE4HMvDe-Q
http://www.youtube.com/watch?v=Lp7E973zozc&feature=relmfu
http://www.youtube.com/p/A0C3C1D163BE880A?hl=en_US&fs=1

目的是仅保存剪辑或播放列表的 ID,以便可以将其嵌入,因此如果它是剪辑:'sGE4HMvDe-Q',或者如果它是播放列表:'p/A0C3C1D163BE880A'

我编写的解析器对于这些 url 工作正常,但似乎有点脆弱和冗长,我只是想知道是否有人可以建议一个更好的 ruby​​ 方法来解决这个问题?

def parse_youtube
    a = url.split('//').last.split('/')
    b = a.last.split('watch?v=').last.split('?').first.split('&').first
    if a[1] == 'p'
        url = "p/#{b}"
    else
        url = b
    end
end

最佳答案

def parse_youtube url
   regex = /(?:.be\/|\/watch\?v=|\/(?=p\/))([\w\/\-]+)/
   url.match(regex)[1]
end

urls = %w[http://youtu.be/sGE4HMvDe-Q 
          http://www.youtube.com/watch?v=Lp7E973zozc&feature=relmfu
          http://www.youtube.com/p/A0C3C1D163BE880A?hl=en_US&fs=1]

urls.each {|url| puts parse_youtube url }
# sGE4HMvDe-Q
# Lp7E973zozc
# p/A0C3C1D163BE880A

根据您的使用方式,您可能需要更好地验证该 URL 确实来自 youtube。

更新:

几年后回到这个话题。我一直对原始答案的草率感到恼火。由于 Youtube 域的有效性无论如何都没有得到验证,我删除了一些内容。

NODE                     EXPLANATION
--------------------------------------------------------------------------------
  (?:                      group, but do not capture:
--------------------------------------------------------------------------------
    .                        any character except \n
--------------------------------------------------------------------------------
    be                       'be'
--------------------------------------------------------------------------------
    \/                       '/'
--------------------------------------------------------------------------------
   |                        OR
--------------------------------------------------------------------------------
    \/                       '/'
--------------------------------------------------------------------------------
    watch                    'watch'
--------------------------------------------------------------------------------
    \?                       '?'
--------------------------------------------------------------------------------
    v=                       'v='
--------------------------------------------------------------------------------
   |                        OR
--------------------------------------------------------------------------------
    \/                       '/'
--------------------------------------------------------------------------------
    (?=                      look ahead to see if there is:
--------------------------------------------------------------------------------
      p                        'p'
--------------------------------------------------------------------------------
      \/                       '/'
--------------------------------------------------------------------------------
    )                        end of look-ahead
--------------------------------------------------------------------------------
  )                        end of grouping
--------------------------------------------------------------------------------
  (                        group and capture to \1:
--------------------------------------------------------------------------------
    [\w\/\-]+                any character of: word characters (a-z,
                             A-Z, 0-9, _), '\/', '\-' (1 or more
                             times (matching the most amount
                             possible))
--------------------------------------------------------------------------------
  )                        end of \1

关于ruby-on-rails - 解析 youtube 网址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6556772/

相关文章:

ruby-on-rails - PGError : ERROR: unrecognized time zone name: "UTC"

ruby-on-rails - 跳过特定 Controller rails 的特定操作的登录

ruby-on-rails - Rails : I update migration file then run db:migrate, 但我的架构没有更新

javascript - 为什么 '' 在我的 charts.js.erb 文件中显示为 '(HTML 实体?)?

javascript - 要保存的 url 参数是 JavaScript 中的

ruby-on-rails - 通过google_oauth2获取“错误:redirect_uri_mismatch”

ruby - 有没有更好的方法从一个 rake 任务中执行多个系统命令?

java - 在一行中查找并替换多个 URL

c# - URL 中的点 (.) 字符错误

ruby - 只允许破折号和数字的正则表达式?