1

Ruby で HTML 用のホワイトリスト ベースのサニタイザーを見たことがありますが、反対のことが必要です。PDF 変換の準備を整えるには、ページから削除されたリンクのみが必要です。サニタイズを試しましたが、取得したページでどの HTML 要素が使用されるかを推測するのが難しすぎて、リストに追加できるようにするのが難しいため、必要なものには合いません。

私の入力が

<a href="link">Link!</a>
<b>Bold Text</b>
<div>A div!</div>

私はしたいです

Link!
<b>Bold Text</b>
<div>A div!</div>

出力になります。

Ruby用の「ブラックリストベースのサニタイザー」はありますか?

4

4 に答える 4

2

Nokogiriなどの HTML パーサーが必要です。これにより、特定のノード (「タグ」) を検索してドキュメントをウォークスルーし、それらに対して何かを行うことができます。

require 'nokogiri'

html = '<a href="link">Link!</a>
<b>Bold Text</b>
<div>A div!</div>
'

doc = Nokogiri.HTML(html)

doc.search('a').each do |a|
  a.replace(a.content)
end

puts doc.to_html

結果は次のとおりです。

<html><body>Link!
<b>Bold Text</b>
<div>A div!</div>
</body></html>

Nokogiri がコードにいくつかの修正を加え、適切な<html>および<body>タグを提供していることに注意してください。ドキュメントフラグメントを使用して返すように指示することもできましたが、通常はそのままにしておきます。

于 2012-11-10T05:10:41.857 に答える
1

まだNokogiriを使用している Tin Man の回答のマイナー バリエーション:

require 'nokogiri' # gem install nokogiri
doc = Nokogiri.HTML( my_html )
doc.css('a,blink,marquee').each do |el|
  el.replace( el.inner_html )
end
cleaned = doc.to_html

ここでの 2 つの違いは次のとおりです。

  1. cssoverを使用して、使用searchされているセレクターについて少し具体的にします (ただし、機能的な違いはありません)。

  2. に置き換えることinner_htmlで、リンク内の可能なマークアップを保持します。たとえば、次のマークアップがあるとします。

    <p><a href="foo">Hi <b>Mom</b></a>!</p>
    

    で置き換えると、次のように.contentなります。

    <p>Hi Mom!</p>
    

    と置き換えると、次のようになり.inner_htmlます。

    <p>Hi <b>Mom</b>!</p>
    
于 2012-11-10T05:20:01.770 に答える