0

我有一个body在模型中调用的文本区域。我想将每张图片更改为该图片的链接。我有这个方法应该可以做到这一点,但它似乎不起作用。它在每个图像处中断。

def get_images_in(body)
  body_with_links = body.gsub( %r{http://[^\s<]+} ) do |url|
    if url[/(?:png|jpe?g|gif|svg)$/]
      "<a href='#{url}' target='_blank'><img src='#{url}' /></a>"
    end
  end
  return body_with_links
end

有任何想法吗?谢谢!

更新

是指向带有示例正文文本的要点的链接。

4

1 回答 1

3

首先,您不需要return在 ruby​​ 中使用语句。默认情况下,Ruby 将返回最后一件事。在您的情况下,这是从返回的字符串gsub

def wrap_image_with_link(body)
  body.gsub( %r{http://[^\s<]+} ) do |url|
    if url[/(?:png|jpe?g|gif|svg)$/]
      "<a href='#{url}' target='_blank'><img src='#{url}' /></a>"
    end
  end
end

这还是不太对。然后我会将我的初始正则表达式集中在img标签上:

def wrap_image_with_link(body)
  body.gsub(/\<img.*src\=['"](.*)['"].*\/\>/) do |url|
    "<a href='#{url}' target='_blank'><img src='#{url}' /></a>"
  end
end

Rails 有几个助手来清理它。

def wrap_images_with_links(body)
  body.gsub(/\<img.*src\=['"](.*)['"].*\/\>/) do    
    link_to(image_tag($1), $1, :target => '_blank')
  end
end

您可能想让 reg ex 不区分大小写:

def wrap_images_with_links(body)
  body.gsub(/.*\<img.*src\=['"](.*)['"].*\/\>/i) do    
    link_to(image_tag($1), $1, :target => '_blank')
  end
end

因此gsub,与 相反sub,更改匹配的正则表达式的每个实例,因此需要稍微调整正则表达式以适应更明确的匹配:

def wrap_images_with_links(body)
  body.gsub(/\<img[\s\w"=]+src\=['"](http[s]?:\/\/[\w.\/]+)['"]\s?[\/]?\>/i) do    
    link_to(image_tag($1), $1, :target => '_blank')
  end
end

根据您的网址的复杂性,您可能需要调整正则表达式以支持?空格以外的字符,但这工作得很好。

于 2013-07-22T04:09:06.657 回答