выберите слово в текстовом блобе в рубине на основе шаблона - PullRequest
1 голос
/ 03 февраля 2012

У меня есть текстовый блоб, и я хотел бы выбрать URL-адреса в зависимости от того, имеют ли они .png или .jpg.Я хотел бы выбрать все слово на основе шаблона.

Например, в этом BLOB-объекте:

width='17'></a>&nbsp;<a href='http://click.e.groupon.com/?  qs=94bee0ddf93da5b3903921bfbe17116f859915d3a978c042430abbcd51be55d8df40eceba3b1c44e'     style=\"text-decoration: none;\">\n<img alt='Facebook' border='0' height='18'   src='http://s3.grouponcdn.com/email/images/gw-email/facebook.jpg' style='display: i

Я хочу выбрать изображение:

http://s3.grouponcdn.com/email/images/gw-email/facebook.jpg

Могу ли я использовать нокогири для html-текста?

Ответы [ 3 ]

4 голосов
/ 03 февраля 2012

Использование Nokogiri и XPath:

frag = Nokogiri::HTML.fragment(str) # Don't construct an entire HTML document
images = frag.xpath('.//img/@src').map(&:text).grep /\.(png|jpg|jpeg)\z/

XPath говорит:

  • .// - в любом месте этого фрагмента
  • img - найти все<img> элементы
    • /@src - теперь найдите атрибут src каждого

Тогда мы:

  • map(&:text) - преобразовать все Nokogiri::XML::Attr в значение атрибута.
  • grep - найти только те строки в массиве, которые заканчиваются соответствующим текстом.
2 голосов
/ 03 февраля 2012

Да, вы можете использовать nokogiri, и вы должны!

Вот простой фрагмент:

require "nokogiri"
str = "....your blob"
html_doc = Nokogiri::HTML(str)
html_doc.css("a").collect{|e| e.attributes["href"].value}.select{|e| e.index(".png") || e.index(".jpeg") }
0 голосов
/ 03 февраля 2012

Если вы хотите найти только URL, заканчивающиеся на .jpg или .png, шаблон, подобный этому, должен это сделать.

https?:\/\/.*?\.(?:jpg|png)
...