如何用绝对路径 URL 替换相对路径 URL

2024-04-02

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

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

我正在尝试前置"http://example.com" to the "/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 字符串,而是使用专门为该工作制作的工具。红宝石包括URI http://www.ruby-doc.org/stdlib-1.9.3/libdoc/uri/rdoc/URI.html类,还有更彻底的可寻址 https://github.com/sporkmonger/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 中的节点,试图理解它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何用绝对路径 URL 替换相对路径 URL 的相关文章

随机推荐

  • Apache 的 Velocity — getTemplate() 。如何传递字符串/对象而不是 .VM 文件

    Apache 的 Velocity getTemplate 实际上它允许传递 vm 文件名 我可以在这里传递字符串 对象吗 有什么方法可以传递字符串 对象吗 这是一个对我有用的示例代码 速度版本 1 7我使用 log4j 作为记录器 imp
  • 当我尝试使用 Facebook 或 Google 登录时,GetExternalLoginInfoAsync 始终返回 null

    我有一个问题OWIN验证 我总是收到空值GetExternalLoginInfoAsync 当我尝试使用 Facebook 或 Google 登录时 但是有一些神秘的情况 当我打开 Fiddler 时 我使用这种方法得到了正确的数据 我不明
  • 在代码中设置静态资源

    我的作品里有几种风格App xaml file
  • 如何对 pandas 数据框中的一组行执行函数?

    我正在尝试实施一个算法 https github com sebleier RDP 假设该算法作为函数 xyz 执行 该函数专门设计用于对轨迹数据 即 x y 坐标 进行操作 该函数有两个参数 第一个参数是list of tuples x
  • Bootstrap 3.0 少于 12 列的网格

    我正在尝试使用只有 7 列的网格创建一个日历 我想让这 7 列均匀分布并适合整行 目前 7 列加起来不等于 12 我得到 12 列 其中 5 列为空 Bootstrap 3 有没有办法让所有 7 分布在一行中 您最好的选择可能是创建您自己的
  • 为什么基于 Glass/GDK 的 VoiceListener 在 XE16 中只能捕获一次 VoiceCommand?

    在寻找一种使用 Google GDK 实现上下文语音命令的方法时 我遇到了这个post https stackoverflow com questions 21168267 然而 示例代码似乎仅适用于 XE12 不适用于 XE16 我最近测
  • 使用一对多关系在 Django 中创建 2 种不同的用户类型

    我正在创建一个篮球统计应用程序 我希望有两种不同的用户类型 教练和球员 我希望教练能够登录并仅查看他的球员的统计数据 因此 一名教练将拥有多名球员 我希望能够为每个教练创建用户个人资料 并仅显示他们的球员 而不是数据库中的所有球员 到目前为
  • 谷歌地图数据层,点击多边形并更改不透明度(Chrome Bug)

    我有一个谷歌地图 我使用 addGeoJson 将几何数据 加载到数据层 一切正常 直到我尝试在多边形上绑定事件以更改 opactiy 设置 我从OSM检索城市边界来绘制多边形 我认为我的json对象格式很好 我以Google作为参考 ht
  • TypeScript 编译中缺少 in-memory-data.service.ts

    浏览 Angular 教程 了解如何在中使用 http 请求https angular io tutorial toh pt6 https angular io tutorial toh pt6 我到了这一点 使用以下命令生成类 src a
  • Sublime Doctype HTML 片段

    有没有办法可以将下面的 作为片段插入 我尝试使用 首选项 gt 键绑定 用户 但引号确实很重要 您可以通过创建一个新的代码片段Tools gt New Snippet
  • onSharedPreferenceChanged 不会一直触发

    我对这个方法有一个奇怪的问题 当我编辑 EditTextPreference 时 仅当我更改值时才调用它 而在 MultiSelectListPreference 上 仅当我第一次更改时才调用它 这是我的片段代码 public class
  • Excel 解算器具有非相邻单元格约束?

    我是 Excel 求解器的新手 只是在拿起一本数据科学书籍后才了解它 我想更熟悉这个工具 所以我一直在尝试解决不同的问题 但我被困在一个问题上 我什至不确定是否可以使用求解器 基本上 我需要检查的约束是两个单元格是否相邻 我的问题 我有一堆
  • 在 Excel 中计算唯一值

    我需要在 Excel 中计算范围 C2 C2080 中的唯一值 谷歌搜索公式 SUM IF FREQUENCY MATCH C2 C2080 C2 C2080 0 MATCH C2 C280 C2 C2080 0 gt 0 1 返回不正确的
  • 使用多层 - KineticJS

    我正在使用 KineticJS 4 0 5 目前正在尝试绘制几个图层的内容 但只绘制了添加到舞台的最后一个图层 如果我正确理解了文档 这应该是可能的 否则我们为什么需要一层 我有三个不同的层 仅包含 Kinetic Rect 对象的背景层
  • MPANDROIDCHART:如何使用 .setViewPortOffsets(0,0,0,0) 绘制 X 标签

    当我的图表已将 setViewPortOffsets 设置为 0 0 0 0 时 我在绘制 X 标签时遇到问题 我知道 setViewPortOffsets 的作用 但我不知道如何设置它以仅使左右边距消失边 有人能帮助我吗 PS 抱歉我的英
  • 逐行修改csv文件

    我有一个大文件 我想修改其中的每一行 我想使用 PHP 快速完成 我的文件是 CSV 文件 20010103 02 00 00 0 9496 20010103 03 00 00 0 9504 20010103 04 00 00 0 9499
  • 有没有办法观察 UIViewPropertyAnimator 中fractionComplete的变化

    我一直在看非常酷的新作品UIViewPropertyAnimatoriOS 10 中的类 它可以让你easily执行诸如暂停 恢复和反转飞行中 UIView 动画之类的操作 过去 您必须操作系统创建的底层 CAAnimations 才能对
  • Android BroadcastReceiver还是简单的回调方法?

    在我的项目中我正在使用BroadcastReceiver作为来自长时间运行的线程的回调 例如 通知活动下载已完成并从 Worker 发送一些响应数据Thread以便活动可以向用户显示适当的消息 使用BroadcastReceiver每次使用
  • :: C++ 中模板函数调用前面的范围解析运算符

    我被模板和范围解析运算符困住了 我在文件中找到了这些行 我无法弄清楚为什么我们在模板函数调用前面使用 据我所知 当引用全局变量时 我们只能在变量前面使用 任何想法都会有帮助 define CREATE AND DECODE TYPE Typ
  • 如何用绝对路径 URL 替换相对路径 URL

    我将 HTML 内容存储在数据库中 并且希望将所有相对资源引用转换为使用绝对路径 例如 我的所有图像标签看起来都是这样的 img src 我正在尝试前置 http example com to the system images 小路 我有