Ruby on rails Ruby:剥离iframe并将其src转换为var

Ruby on rails Ruby:剥离iframe并将其src转换为var,ruby-on-rails,ruby,ruby-on-rails-4,iframe,Ruby On Rails,Ruby,Ruby On Rails 4,Iframe,我试图解析一个包含iframe的字符串,将其src属性转换为一个特殊格式的Ruby变量,然后用以特定方式格式化的Ruby变量替换字符串中的iframe。到目前为止,我写了以下内容: def video_parse(string) if string.include?('youtube.com/?v=') url = 'youtube.com/?v=' string.gsub!('<iframe>.*</iframe>', video_service('

我试图解析一个包含iframe的字符串,将其
src
属性转换为一个特殊格式的Ruby变量,然后用以特定方式格式化的Ruby变量替换字符串中的iframe。到目前为止,我写了以下内容:

def video_parse(string)
  if string.include?('youtube.com/?v=')
    url = 'youtube.com/?v='
    string.gsub!('<iframe>.*</iframe>', video_service('YOUTUBE', vid(string, url)))
  end
  if string.include?('player.vimeo.com/video/')
    url = 'player.vimeo.com/video/'
    string.gsub!('<iframe>.*</iframe>', video_service('VIMEO', vid(string, url)))
  end
  string
end

def vid(string, url)
  string.split(url).last.split(/['"]/).first
end

def video_service(service, vid)
  "*|#{service}:[$vid=#{vid}]|*"
end
第二次尝试看起来是这样的,但仍然不能替代任何东西:

def mailchimp_video_parse(string)
  if string.include?('youtube.com/?v=')
    string.gsub!(iframe) { video_service('YOUTUBE', vid(Regexp.last_match[1])) }
  end
  if string.include?('player.vimeo.com/video/')
    string.gsub!(iframe) { video_service('VIMEO', vid(Regexp.last_match[1])) }
  end
  string
end

def vid(iframe)
  iframe.split!('src').last.split!(/"/).first
end

def iframe
  '<iframe.*<\/iframe>'
end

def video_service(service, vid)
  "*|#{service}:[$vid=#{vid}]|*"
end
def mailchimp_video_parse(字符串)
if string.include?('youtube.com/?v='))
string.gsub!(iframe){video_service('YOUTUBE',vid(Regexp.last_match[1])}
结束
if string.include?('player.vimeo.com/video/')
string.gsub!(iframe){video_服务('VIMEO',vid(Regexp.last_match[1])}
结束
一串
结束
def视频(iframe)
伊夫拉,分开!('src').last.split!(/“/)。首先
结束
def iframe
'
  • iframe
    方法应为
    /
    
  • 使用Nokogiri时,
    iframe
    方法应该更安全一些:

    d = Nokogiri::HTML(string)
    d.css('iframe').each do |i|
      if i['src'] =~ %r{(youtube|vimeo).*?([^/]+)$}i
        i.replace(video_service($1.upcase, $2)
      end
    end
    puts d.to_html
    

    (但请注意,它的效率低于纯regexp解决方案,因为Nokogiri将解析整个HTML。)

    使用Nokogiri更安全一些:

    d = Nokogiri::HTML(string)
    d.css('iframe').each do |i|
      if i['src'] =~ %r{(youtube|vimeo).*?([^/]+)$}i
        i.replace(video_service($1.upcase, $2)
      end
    end
    puts d.to_html
    

    (但请注意,它的效率低于纯regexp解决方案,因为Nokogiri将解析整个HTML。)

    你能举一个例子说明什么
    string
    可能是问题已经更新了。你能举一个例子说明什么
    string
    可能是问题已经更新了。当然,该死。尽管我的
    vid
    方法现在返回了这个错误:
    NoMethodError:nil的未定义方法'split':NilClass from(irb):359:in vid
    so
    Regexp.lastmatch[1]
    一定返回了错误的内容。上面的编辑会给你一个结果,但它可能不是你想要的,当然,你可能必须重做
    video\u服务
    methodAmit。虽然我的
    vid
    方法现在返回这个错误:
    NoMethodError:nil的未定义方法'split':NilClass from(irb):359:在vid
    中,因此
    Regexp.lastmatch[1]
    必须返回错误的内容。上面的编辑将给您一个结果,但它可能不是您想要的,您可能必须重新执行
    视频服务
    方法,太完美了,无法将其标记为正确。谢谢!太完美了,无法将其标记为正确。谢谢!
    d = Nokogiri::HTML(string)
    d.css('iframe').each do |i|
      if i['src'] =~ %r{(youtube|vimeo).*?([^/]+)$}i
        i.replace(video_service($1.upcase, $2)
      end
    end
    puts d.to_html