我写了一个 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/