3

HTML コンテンツをデータベースに保存しており、すべての相対アセット参照を変換して、代わりに絶対パスを使用したいと考えています。たとえば、私の画像タグはすべて次のようになっています。

<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/")
4

3 に答える 3

9

通常の文字列操作を使用して 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 のノードを書き換え/トリムすることができます。

于 2013-04-09T19:22:37.010 に答える