用绝对路径url替换相对路径url

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

 

我正在尝试将“ http://mydomain.com ”添加到“/ system / images /”位,我有以下代码,我希望能够处理它,但遗憾的是它似乎没有导致任何更改:

 text = "" text.gsub(%r{<img src=\\('|")\/system\/images\/}, "<img src=\"http://virtualrobotgames.com/system/images/") 

使用为作业制作的工具,而不是使用正常的字符串操作来操作URL字符串。 Ruby包含URI类,并且有更彻底的Addressable gem。

如果我有一些带有我想重写的链接的HTML,那么这就是我要做的事情:

首先,解析文档:

 require 'nokogiri' require 'uri' SOURCE_SITE = "http://virtualrobotgames.com" html = '      foo   ' 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) 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 

运行后输出:

     foo   

这并不是一个完整的,完整的例子。 这与绝对链接一起使用,但您必须处理相对链接,与兄弟/对等主机名的链接,缺少参数。

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

你能不能只使用’base’html标签来做到这一点? 假设您直接从url阅读html内容,您可以执行以下操作:

 response = RestClient.get() base_url = '' html_content = response.body if html_content.index('') html_content = html_content.gsub!('', "") end 

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

 %r{ 

变得简单:

 %r{