我在模型中有一个名为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
有什么想法吗?感谢您!
更新
Here's指向带有示例正文文本的要点的链接。
答案 0 :(得分:3)
首先,您不需要在ruby中使用return
语句。 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
相反,会更改匹配的reg-ex的每个实例,因此需要稍微调整一下reg ex以适应更明确的匹配:
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
根据您网址的复杂程度,您可能需要调整reg-ex以支持?
或除空格以外的字符,但这项工作非常顺利。