我有一堆HTML内容存储在数据库中,我希望将所有相对资产引用转换为使用绝对路径。例如,我的所有图片代码都是这样的:
<img src=\"/system/images/146/original/03.png?1362691463\">
我正在尝试将“http://mydomain.com”添加到“/ system / images /”位,我有以下代码,我希望能够处理这些代码,但遗憾的是它似乎没有导致任何代码变化:
text = "<img src=\"/system/images/146/original/03.png?1362691463\">"
text.gsub(%r{<img src=\\('|")\/system\/images\/}, "<img src=\"http://virtualrobotgames.com/system/images/")
答案 0 :(得分:8)
使用为作业制作的工具,而不是使用常规字符串操作来操作URL字符串。 Ruby包含URI类,并且有更全面的Addressable gem。
如果我有一些带有我想重写的链接的HTML,那就是我要做的事情:
首先,解析文档:
require 'nokogiri'
require 'uri'
SOURCE_SITE = "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)
然后,您就可以浏览文档并修改<a>
,<img>
,<script>
等标记以及其他任何内容:
# 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)
if uri.relative?
uri.scheme = SOURCE_SITE.scheme
uri.host = SOURCE_SITE.host
node[url_param] = uri.to_s
end
end
end
puts doc.to_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=US-ASCII"></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>
这并不是一个完整的,完全有效的例子。这是使用绝对链接,但你必须处理相对链接,与兄弟/对等主机名的链接,缺少参数。
您还需要在解析后检查“doc”的errors
方法,以确保它是有效的HTML。解析器可以在无效的HTML中重写/修剪节点,试图理解它。
答案 1 :(得分:1)
你能不能只使用'base'html标签来做这件事?假设您直接从网址阅读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
答案 2 :(得分:0)
显然这是我传递的搜索参数的问题,不需要转义序列。
%r{<img src=\\('|")\/system\/images\/}
变得简单:
%r{<img src="/system/images/}