通常の文字列操作を使用して 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
また、解析後に「ドキュメント」のメソッドをチェックして、それが有効な HTML であることを確認する必要があります。パーサーは、意味を理解しようとして、無効な HTML のノードを書き換え/トリムすることができます。