gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 07:45:20 24 4
gpt4 key购买 nike

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

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

我正在尝试将 "http://example.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/")

最佳答案

不要使用正常的字符串操作来操作 URL 字符串,而是使用专为该工作制作的工具。 Ruby 包括 URI类,还有更彻底的 Addressable gem 。

如果我有一些带有我想重写的链接的 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)

然后您就可以遍历文档并修改标签,例如 <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)
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

运行后输出:

# >> <!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>

这并不是一个完整的、功能齐全的示例。这适用于绝对链接,但您必须处理相对链接、具有同级/对等主机名的链接、缺少参数。

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

关于ruby-on-rails - 如何用绝对路径 URL 替换相对路径 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15888491/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com