如何用绝对路径 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 的相关文章

  • 地图、每个和收集之间有什么区别? [复制]

    这个问题在这里已经有答案了 在 Ruby 中 功能之间有什么区别吗 each map and collect each不同于map and collect but map and collect是相同的 技术上map是一个别名collect
  • 避免在 Ruby 中自动从 Fixnum 转换为 Bignum

    我正在将算法从 C 移植到 Ruby 该算法有一个方法返回一个int有时会溢出 private static int NextRandom int n return 1234567890 n 12345 该算法利用溢出来避免该函数返回的值超
  • close 似乎不适用于 WebSocket

    我有这个简单的 JavaScript 代码 window ws new WebSocket ws 127 0 0 1 8000 ws onopen function ws send hello Ruby 中的服务器如下所示 require
  • 从 ActiveRecord 获取表名

    I used ActiveRecord Base set table name在动态创建的 ActiveRecord 类上设置我的表名称 现在我需要知道稍后如何获得该值 api 文档没有提及如何执行此操作 另外 我无法从 ActiveRec
  • Ruby 代码到 JAR

    我希望能够将 ruby 程序编译为 java JAR 程序 我研究过 JRuby 看到了几个能够 eval ruby 代码的 Java 应用程序示例 但是是否有更优雅的解决方案允许简单地用 ruby 编写所有内容 然后将其直接编译为 JAR
  • 回形针如何更改基本名称(文件名)?

    我正在尝试更改照片的基本名称 文件名 在我的模型中我有 attr accessor image url basename has attached file image styles gt original gt 300x250 gt pn
  • 如何使用 Rails 应用程序中的 s3 在存储桶之间复制文件?

    我目前正在开发一个 Rails 应用程序 尝试将视频从 s3 中的一个存储桶复制 移动到另一个存储桶 但是我在 Rails 应用程序上不断收到代理错误 502 在杂种日志中 它显示 无法分配内存 一旦发生此错误 应用程序就会终止 我们必须重
  • 如何在 Rails 6 中禁用 TurboLinks?

    所以我面临这个问题 我的服务器实际上从客户端的请求中检索了正确的数据 并将这些数据发送到浏览器 我可以清楚地看到它可用于浏览器 CTRL SHIFT C gt Network gt my request 但是 浏览器不会刷新 所以我现在看到
  • 如何使用 ruby​​ 的循环和 haml 创建表?

    我正在尝试制作一个如下所示的 html 表 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 我的数据结构是这样的 f ary 1 250 这是我的哈姆尔代码 table border gt 1 tbody tr cnt 0 f
  • Ruby:在 Ubuntu 上安装 rmagick

    我正在尝试在 Ubuntu 10 04 上安装 RMagick 看起来here https stackoverflow com questions 1482823 is there an easy way to install rmagic
  • 如何检查水豚中的复选框?

    我正在使用 Rspec 和水豚 我怎样才能写一个步骤来检查checkbox 我试过了check按价值但它找不到我的checkbox 我不知道该怎么做 因为我实际上有相同的 ID 但值不同 这是代码
  • Rails 中的并行方法

    我的 Rails Web 应用程序有数十种方法 从调用 API 到处理查询结果 这些方法具有以下结构 def method one batch query API process data end def method nth batch
  • 如何从数组中删除空白元素?

    我有以下数组 cities Kathmandu Pokhara Dharan Butwal 我想从数组中删除空白元素并想要以下结果 cities Kathmandu Pokhara Dharan Butwal 有没有类似的方法compact
  • 如何让 Sinatra 通过 HTTPS/SSL 工作?

    正如标题所示 谷歌没有提供任何与此相关的有用信息 如何为 Sinatra 应用程序设置和配置 HTTPS SSL 如何创建 HTTPS 路由 我以前从未在我的应用程序中使用过 HTTPS 也没有调整 Rack 其他内容的经验 所以我很欣赏详
  • 为什么 Rails 5 将“索引”更改为“外键”?

    如果你在 Rails 4 中有这个 t references event index true 现在你可以使用foreign key代替index在 Rails 5 中 我不太明白为什么他们决定这样做 因为功能保持不变 您添加的是索引 而不
  • gem install rmagick 在 OS X El Capitan 上失败

    几天前我升级到 El Capitan 并运行了 brew update brew upgrade 它更新了 imagemagick 导致 ruby 的 rmagick gem 停止工作 我想没问题 我就跑 gem install rmagi
  • 用于 RESTful 轨道应用程序的简单面包屑

    是否有任何辅助方法 除了默认 Rails 面包屑导航 http wiki rubyonrails org rails pages Breadcrumbs 为特定页面动态生成面包屑导航 而无需在 RESTful 应用程序中传递琐碎的参数 也就
  • Capybara 的 has_selector 有哪些选项?

    我在 RSpec 中遇到此错误 有没有任何文档have selector解释了选项哈希中的每个键以及它到底有什么作用 invalid keys content should be one of text visible between co
  • 在任意时间范围内找到最佳日/月/年间隔的算法?

    如果您有时间表 请说 March 19 2009 July 15 2011 是否有一种算法可以将该时间范围分解为 March 19 2009 March 31 2009 complete days April 1 2009 December
  • 设备注册控制器获取零资源的自定义操作

    基本上我想要有两个单独的操作来更改密码和更改电子邮件 而不是只有一个 我已经更新了我的路由以指向继承自 Devise RegistrationsController 的新控制器 我的路线 rb devise for users contro

随机推荐

  • 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 小路 我有