首先,您不需要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
根据您的网址的复杂性,您可能需要调整正则表达式以支持?
空格以外的字符,但这工作得很好。