Ruby on rails 如何用绝对路径URL替换相对路径URL

Ruby on rails 如何用绝对路径URL替换相对路径URL,ruby-on-rails,ruby,Ruby On Rails,Ruby,我将HTML内容存储在数据库中,我希望将所有相对资产引用转换为使用绝对路径。例如,我所有的图像标签都是这样的: <img src=\"/system/images/146/original/03.png?1362691463\"> 显然这是我传递的搜索参数的问题,转义序列不是必需的 %r{<img src=\\('|")\/system\/images\/} %r{ 变得简单: %r{<img src="/system/images/} %r{不要使用普通的字符串操

我将HTML内容存储在数据库中,我希望将所有相对资产引用转换为使用绝对路径。例如,我所有的图像标签都是这样的:

<img src=\"/system/images/146/original/03.png?1362691463\">

显然这是我传递的搜索参数的问题,转义序列不是必需的

%r{<img src=\\('|")\/system\/images\/}
%r{
变得简单:

%r{<img src="/system/images/}

%r{不要使用普通的字符串操作来操作URL字符串,而是使用为该作业制作的工具

如果我有一些HTML链接想重写,我会这样做:

首先,解析文档:

require 'nokogiri'
require 'uri'

SOURCE_SITE = URI.parse("http://virtualrobotgames.com")

html = '
<html>
<head></head>
<body>
  <img src="/system/images/146/original/03.png?1362691463">
  <script src="/scripts/foo.js"></script>
  <a href="/foo/bar.html">foo</a>
</body>
</html>
'
doc = Nokogiri::HTML(html)
运行后,输出:

# find things using 'src' and 'href' parameters
tags = {
  'img'    => 'src',
  'script' => 'src',
  'a'      => 'href'
}
doc.search(tags.keys.join(',')).each do |node|

  url_param = tags[node.name]

  src = node[url_param]
  unless (src.empty?)
    uri = URI.parse(src)
    unless uri.host
      uri.scheme = SOURCE_SITE.scheme
      uri.host = SOURCE_SITE.host
      node[url_param] = uri.to_s
    end
  end
end

puts doc.to_html
#>>
# >> 
# >> 
# >> 
# >>   
# >>   
# >>   
# >> 
# >> 
这并不是一个完整的、完全有效的示例。这是一个绝对链接,但您必须处理相对链接、具有兄弟/对等主机名的链接以及缺少的参数


您还需要在解析后检查“doc”的
errors
方法,以确保它是有效的HTML。解析器可以重写/修剪无效HTML中的节点,试图理解它。

您不能只使用“base”HTML标记来完成此操作吗?。假设您直接从URL读取HTML内容,您可以执行以下操作:

# >> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
# >> <html>
# >> <head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head>
# >> <body>
# >>   <img src="http://virtualrobotgames.com/system/images/146/original/03.png?1362691463">
# >>   <script src="http://virtualrobotgames.com/scripts/foo.js"></script>
# >>   <a href="http://virtualrobotgames.com/foo/bar.html">foo</a>
# >> </body>
# >> </html>
response=RestClient.get()
基本url=“”
html_content=response.body
如果html_content.index(“”)
html_content=html_content.gsub!(“”,“”)
结束

您应该考虑使用专门为该作业设计的工具:。它有解析URL、更改方案和主机、弄乱路径的方法,然后吐出一个所有内容都已正确编码的字符串。@theTinMan我喜欢这个想法,如果您将其重新表述为一个答案,我很乐意接受。我添加了一个扩展示例。您不能使用c字符串上的所有URI方法必须是
URI(SOURCE\u SITE)。scheme
若要仅获取body标记内的html,请使用doc.at('body')。inner_html@Sidhannowe,这就是代码使用
uri=uri.parse(src)的原因
,它将字符串解析为URI对象。@theTinMan谢谢你,你的回答帮助我快速完成了类似的事情。@Sidhanowe是对的,代码声明了
URI
,但试图调用声明url的字符串上的
scheme
host
(变量
源站点
)。我编辑了代码。不要编辑人们答案中的代码。这会歪曲他们所说的。欢迎您发表评论或添加一个单独的答案来说明差异。似乎有几个人编辑了代码,但更改错误。我会修复它。
# >> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
# >> <html>
# >> <head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head>
# >> <body>
# >>   <img src="http://virtualrobotgames.com/system/images/146/original/03.png?1362691463">
# >>   <script src="http://virtualrobotgames.com/scripts/foo.js"></script>
# >>   <a href="http://virtualrobotgames.com/foo/bar.html">foo</a>
# >> </body>
# >> </html>
response = RestClient.get(<original_url>)
base_url = '<your_base_url>'
html_content = response.body
if html_content.index('<head>')
    html_content = html_content.gsub!('<head>', "<head><base href='#{base_url}'>")
end