【问题标题】:How to extract the img src content from a text in ruby如何从ruby中的文本中提取img src内容
【发布时间】:2014-03-26 04:50:10
【问题描述】:

我在 Ruby 的一个变量中有以下字符串。

"<p><img alt=\"\" src=\"/ckeditor_assets/pictures/35/content_raw_lemon_cheesecake.jpg\" style=\"height:533px; width:800px\" /></p>\r\n"

我只想提取src内容,即:

"/ckeditor_assets/pictures/35/content_raw_lemon_cheesecake.jpg\" 

在 Ruby 中,如何从 src 属性中提取文本?

【问题讨论】:

  • 你有没有尝试过?
  • 显示为要提取的内容的行 ("/ckeditor...jpg\") 需要在末尾使用非转义双引号以匹配开头的双引号。您需要添加一个(或更可能,我怀疑)将末尾的转义引号更改为非转义引号。

标签: ruby regex string


【解决方案1】:

这应该可以解决问题...

test = '"<p><img alt=\"\" src=\"/ckeditor_assets/pictures/35/content_raw_lemon_cheesecake.jpg\" style=\"height:533px; width:800px\" /></p>\r\n"'
src  = /src=\\"(.*?)\\"/.match(test)

puts src[1] # outputs /ckeditor_assets/pictures/35/content_raw_lemon_cheesecake.jpg

正确解释:

1.) 它寻找src=\"(我们必须用\\ 转义\)。

2.) 一旦找到它,(.*?) 会抓取所有内容,直到下一场比赛。

3.) 下一场比赛是\"(同样我们必须用\\ 转义\)。



Regexp 类的.match 方法返回一个哈希值。在这种情况下,第一个索引是您测试的字符串。哈希的第二个索引将包含您的结果。



或者,如果您不喜欢正则表达式的外观并且更愿意使用 css 选择器,nokogiri 的 css 方法可以帮助您。

require 'nokogiri'

test = "<p><img alt=\"\" src=\"/ckeditor_assets/pictures/35/content_raw_lemon_cheesecake.jpg\" style=\"height:533px; width:800px\" /></p>\r\n"

html = Nokogiri::HTML(test)
html.css("img").attribute('src').to_s # outputs /ckeditor_assets/pictures/35/content_raw_lemon_cheesecake.jpg

【讨论】:

    【解决方案2】:

    使用 html/xml 解析器,在 ruby​​ 中 Nokogiri 是一个不错的选择。示例:

    require 'nokogiri'
    html = "<p><img alt=\"\" src=\"/ckeditor_assets/pictures/35/content_raw_lemon_cheesecake.jpg\" style=\"height:533px; width:800px\" /></p>\r\n"
    doc = Nokogiri::HTML(html)
    src = doc.xpath("//img")[0]['src']
    

    在本例中,xpath 用于提取所有节点,选择第一个,然后将 'src' 属性作为字符串返回。

    【讨论】:

    • 短而甜蜜的目标!
    • 不知何故,这似乎是在使用大锤来驱动大头钉。
    • @Ajay 虽然您接受了这一点,但请查看 Arup 的回答。它使用标准库中的解析器,因此可能更方便:)
    • @CarySwoveland 视情况而定 - 对于一次性的 hack,正则表达式可以,但 html 非常复杂,因此使用解析器几乎总是适合这项工作的工具。
    • @Tim 我同意,但似乎 OP 并没有实现复杂的功能,只需要一些小东西。但是,我同意你的观点,如果他们一遍又一遍地实现 html 解析,我会使用 html 解析库。
    【解决方案3】:

    使用REXML::Document

    require 'rexml/document'
    
    doc = REXML::Document.new("<p><img alt=\"\" src=\"/ckeditor_assets/pictures/35/content_raw_lemon_cheesecake.jpg\" style=\"height:533px; width:800px\" /></p>\r\n") 
    doc.get_elements('//p/img')[0].attribute('src').to_s
    # => "/ckeditor_assets/pictures/35/content_raw_lemon_cheesecake.jpg"
    

    【讨论】:

    • 我比我的回答更喜欢这个,因为 rexml(我不知道!)在标准库中。
    • @TimPeters 谢谢你.. :-)
    【解决方案4】:

    要提取srcstyle 之间的字符串,我会使用这个:

    text[/src=\"(.*)\"\sstyle=\"/,1]
      #=> "/ckeditor_assets/pictures/35/content_raw_lemon_cheesecake.jpg" 
    

    我假设您不希望在所需输出中显示末尾的转义双引号,但如果您这样做,请将正则表达式更改为:

    /src=\"(.*)\sstyle=\"/
    

    【讨论】:

    • 我喜欢你不使用依赖!
    • @Seth,我不熟悉与正则表达式相关的“依赖”一词。请解释一下。
    • 添加外部库。 require 'some-library-to-help-out'.
    猜你喜欢
    • 2020-12-14
    • 2020-03-11
    • 2021-07-16
    • 2019-08-03
    • 1970-01-01
    • 2021-06-02
    • 1970-01-01
    • 1970-01-01
    • 2018-08-10
    相关资源
    最近更新 更多