1. ホーム
  2. スクリプト・コラム
  3. ルビートピックス

アプレットを置き換えるHTMLスクリプトを記述するRubyの例

2022-01-30 07:22:36

次のような内容のファイルがたくさんある場合。

<p style="display:none">Choose D for this question.
....
....
....
</p>


そして、実現したいのは、それを置き換えることです。

<div style="display:none" class="sl_explain"> Choose D for this question.
.....
.....
.....
</div>


これは少し簡単そうに見えますが、この機能を実装するのに半日かかりました。主に、私は長い間Rubyのプログラムを書いていないのでAPIに慣れていないこと、次に、正規表現、特にRubyの正規表現に慣れていないこと、最後に、いくつかの細部の検討が十分でないことが理由です。
上記の機能を実装するには、2つのステップに分けることができる。最初のステップは

<p style="display:none">Choose D for this question.
....
....
....
</p>


を置き換えてください。

<p style="display:none"> Choose D for this question. ............ </p>


この形式は、なぜそれを置き換えるのか、ファイルを読む際に、一行ずつ読む必要があるため、そこにある "単語 "が、その行を読むことができず、正規表現のマッチングでは、当然、すべてにマッチしません。これを達成するために、我々は唯一の置換を置き換える必要があります。

<p style="display:none"> Choose D for this question. ............ </p>


また、内部的にはいくつかの制約がありますが、以下のようなコードで実装されています。
File.open("logic-fill2.htm","w") do |test|.

File.open("logic_fill.htm",'r:gbk') do |file|
 file.each_line do |line|
 if(line.start_with?('<p style="display:none">') && !line.end_with?("</p>\n"))
  line.gsub!(Regexp.new('\n'), '')
  end
 test.print line
 end
end
end


置換した内容を新しいファイル "logic_fill2 に置きます。 html"(注1、上記のファイルへの出力は、putsではなくprintを使用すると、そうでなければ当然 \n が追加され、その後何もせずに置換されます;注2、上記の end_with も、行末を読むと見えない改行があるため \n が追加されます;注3、時々 <p style="display: \n この行の最後を読むと、見えない改行があるからです \n; 注3、時々 <p style="display:none"> 前にスペースが入るので、start_withをincludeに変更すればいいのですね? に変更し、このファイルを読み込んで、正規表現で置換し、置換した内容を"test.html"に戻すというものです。

File.open("test.html","w") do |test|
File.open("logic_fill2.htm",'r') do |file|
 file.each_line do |line|
  line.gsub!(Regexp.new('<p style="display:none">(. *)</p>'), '<div style="display:none" class="sl_explain">\1</div>')
  test.puts line
 end
end

end



このようにして、私の実現したい機能が実現される。また、ファイルを一行ずつ読み込まない場合は、以下のように複数行のマッチングで行うことも可能です。

Regexp.new('<p style="display:none">(. *)</p>',Regexp::MULTILINE)


残念ながら、行単位で読み取る方法しか思いつかなかったので、複数行のマッチングパターンは使えません。