Парсинг YouTube URL - PullRequest
       2

Парсинг YouTube URL

8 голосов
/ 02 июля 2011

Я написал анализатор URL-адреса ruby ​​на YouTube. Он предназначен для ввода URL-адреса youtube одной из следующих структур (сейчас это структуры URL-адресов youtube, которые я смог найти, может быть, есть и другие?):

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

Цель состоит в том, чтобы сохранить только идентификатор клипа или списка воспроизведения, чтобы его можно было встроить, например, если это клип: '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

Ответы [ 3 ]

19 голосов
/ 02 июля 2011
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
5 голосов
/ 02 июля 2011

Используя Addressable gem, вы можете сэкономить некоторые работы. В stdlib также есть модуль URI, но Addressable более мощный.

require 'addressable/uri'

uri = Addressable::URI.parse(youtube_url)
if uri.path == "/watch"
  uri.query_values["v"] if uri.query_values
else
  uri.path
end

РЕДАКТИРОВАТЬ | Убрано безумие. Не заметил, что Addressable уже обеспечивает #query_values.

4 голосов
/ 02 июля 2011
require 'uri'
require 'cgi'

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]

def parse_youtube url
  u = URI.parse url
  if u.path =~ /watch/
    p CGI::parse(u.query)["v"].first
  else
    p u.path
  end
end

urls.each { |url| parse_youtube url }
#=> "/sGE4HMvDe-Q"
#=> "Lp7E973zozc"
#=> "/p/A0C3C1D163BE880A"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...