2

私はいくつかの HTML をサニタイズして、単一のタグを削除しようとしています (そして、nokogiri などの使用を本当に避けたいと思っています)。したがって、次の文字列が表示されます。削除したいのは次のとおりです。

<div class="the_class>Some junk here that's different every time</div>

これは私の文字列に 1 回だけ表示されます。これを削除する方法を見つけたいと思います。すべてをキャプチャする正規表現を考え出そうとしましたが、うまくいくものを見つけることができません。

私は試してみまし/<div class="the_class">(.*)<\/div>/mたが、それは機能しますが、ドキュメント内のそれ以上のタグも含めて一致しますが</div>、これは望ましくありません。

これにアプローチする方法についてのアイデアはありますか?

4

2 に答える 2

7

次のように、貪欲でない正規表現を探していると思います。

/<div class="the_class">(.*?)<\/div>/m

追加された に注意してください?。現在、キャプチャ グループは、できるだけ多く (欲張り) ではなく、できるだけ少なく (欲張りではない) キャプチャします。

于 2012-11-19T00:17:16.960 に答える
0

別の依存関係が追加され、作業が遅くなるためです。物事をより複雑にします。さらに、このソリューションは HTML タグ以外にも適用できます。私の開始文字列と終了文字列は何でもかまいません。

スパイダーと Web サイト分析を作成する仕事に就くまでは、同じように考えていました。その後、大きな RSS 集約システムを作成しました。パーサーは、その狂気から抜け出す唯一の方法でした。それがなければ、作品は決して完成しなかったでしょう。

はい、正規表現は優れていて便利ですが、ドラゴンがあなたを待っています. たとえば、次の一般的な文字列は問題を引き起こします。

'<div class="the_class"><div class="inner_div">foo</div></div>'

正規表現/<div class="the_class">(.*?)<\/div>/mは次を返します。

"<div class=\"the_class\"><div class=\"inner_div\">foo</div>"

この不正な形式のレンダリング可能な HTML:

<div class="the_class"><div class="inner_div">foo

さらに悪いです:

'<div class="the_class"><div class="inner_div">foo'[/<div class="the_class">(.*?)<\/div>/m]
=> nil

一方、パーサーは次の両方を処理できます。

require 'nokogiri'
[
  '<div class="the_class"><div class="inner_div">foo</div></div>',
  '<div class="the_class"><div class="inner_div">foo'
].each do |html|
  doc = Nokogiri.HTML(html)
  puts doc.at('div.the_class').text
end

出力:

foo
foo

はい、開始文字列と終了文字列は何でもかまいませんが、HTML/XML を解析するためのよく知られたツールがあり、タスクが大きくなるにつれて、正規表現を使用する際の弱点が明らかになります。

そして、はい、パーサーが失敗する可能性があります。私は RSS フィードを処理する必要がありましたが、これはひどく不正な形式であり、パーサーが爆発しましたが、少し前処理を行うことで問題が解決しました。

于 2012-11-20T16:42:02.367 に答える