2016-02-16 43 views
0

我試圖分析其中包含iframe的字符串,將其src屬性轉換爲特殊格式的Ruby變量,然後將字符串中的iframe替換爲Ruby變量以特定的方式格式化。到目前爲止,我已經寫到:紅寶石:剝離iframe並將其src轉換爲var

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 

但它並不代替任何東西。我懷疑我的通配符iframe標籤選擇是錯誤的,加上我的vid方法有點笨重。如何讓我的通配符gsub正常工作?對於獎勵積分,我可以更有效地寫一點,所以我不解析string來重新格式化iframe中的src

更新

字符串看起來是這樣的:

string = 'resources rather than creating our luck through innovation.\n<br>\n<br> \n<iframe allowfullscreen=\"\" frameborder=\"0\" height=\"311\" mozallowfullscreen=\"\" name=\"vimeo\" src=\"http://player.vimeo.com/video/222234444\" webkitallowfullscreen=\"\" width=\"550\"></iframe>\n<br>\n<br>\nThat hasn’t stoppe' 

第二次嘗試看起來是這樣,仍然不能取代任何東西:

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 

仍然一無所獲。

+0

你能舉一個'string'可能的例子嗎 – Sid

+0

問題已經更新。 –

回答

1

有點與引入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 

(但是請注意,它比純粹的正則表達式的解決方案高效,如引入nokogiri會分析整個HTML )

+0

這太完美了,不能標記它是正確的。謝謝! –

1
  1. iframe方法應該是/<iframe.*<\/iframe>/爲它被正確識別爲一個正則表達式

  2. Regexp.last_match[1]Regexp.last_match[0]mailchimp_video_parse方法

  3. split!需求是在剛剛splitvid方法(Ruby中沒有split!方法)

編輯方法:安全

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

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

def iframe 
    /<iframe.*<\/iframe>/ 
end 
+0

當然是該死的。儘管我的'vid'方法現在返回這個錯誤:'NoMethodError:未定義方法'拆分'爲nil:NilClass from(irb):359:in vid'所以'Regexp.lastmatch [1]'必須返回錯誤的東西。 –

+1

上面的編輯會給你一個結果,但它可能不是你正在尋找的,你可能不得不重做'video_service'方法 – Sid