C#でタグを削除する方法

このQ&Aのポイント
  • C#でhtmlファイルからタグを削除する方法を解説します。
  • 正規表現を使用して、大文字で書かれたタグも削除することができます。
  • StreamReaderとStringBuilderを使用して、htmlファイルを読み込み、タグを削除する方法を紹介します。
回答を見る
  • ベストアンサー

C#でタグを削除する方法

htmlファイルをtextBoxに読み込んで、その中にあるタグのみを正規表現で削除したいです。 FileStream file = File.Open ( @"c:\test.html", FileMode.Open ); Encoding enc = Encoding.GetEncoding("Shift_JIS"); reader = new StreamReader( file ,enc); StringBuilder text = new StringBuilder(); while(reader.Peek() != -1) {   string A = reader.ReadLine().ToString();   A = Regex.Replace(A,@"<(([^>]|\n)*)>","");   text.Append(A); } textBox1.Text = text.ToString(); とすると、ある程度のタグは削除できるんですが、<DIV などの大文字で書かれたタグが削除できませんでした。 解る方いらっしょいましたら宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • sakuhat
  • ベストアンサー率61% (11/18)
回答No.1

<DIV ってなってますけど <DIV   align="center"> みたいに改行が入っているタグでしょうか? 1行ずつでないなら <([^>]|\n)*>で置換できます。 1行ずつやるなら (<[^>]*>|<[^>]*$|^[^<]*>) でしょうかね。 ただし両方ともタグ以外に「<」、「>」が使われていないことを前提にしてますけど・・・ もっといい方法があるかもしれません。

nirusu
質問者

お礼

1行ずつ出ない方法で全てのタグが削除されました。 ありがとうございました。後は以外の文が取り除ければ OKなんですが・・・。 解りましたら宜しくお願いします。 BODY { FONT-FAMILY: ヒラギノ明3-Leaf外字付等幅,"MS P明朝"}B { FONT-FAMILY: ヒラギノ角5-Leaf外字付等幅,"MS Pゴシック"}H2 { FONT-FAMILY: ヒラギノ角5-Leaf外字付等幅,"MS Pゴシック"}.oubun { FONT-FAMILY: Century,Times New Roman,"MS P明朝"}RUBY { WORD-SPACING: -5px}

nirusu
質問者

補足

残ってしまうタグは、<DIV style="MARGIN-LEFT: 1em; TEXT-INDENT: -1em"> や <SPAN style="BACKGROUND: #afafaf"> や <FONT color=red> が残っています。

その他の回答 (2)

  • sakuhat
  • ベストアンサー率61% (11/18)
回答No.3

<style(※)*</style> ※「に</style>を含まない」正規表現を入れる で置換くらいしか自分には思いつかないです・・・ 文字列を含まない正規表現 http://www.axis.t.u-tokyo.ac.jp/~shunak/memo/regc.html きちんとやるにはやはりBLUEPIXYさんの言うようにしなくてはなりませんね。 私は以前にブラウザのタグをすべて取得して属性などの変更をする ツールを作ったときはMSHTMLを使いました。 VC#のやり方ですけどこちらをどうぞ http://www.microsoft.com/japan/msdn/academic/Articles/fun/02/ もっと詳しいサイトがあったのですが そのサイトがどこにあるかわからなくなってしまいました・・・ あと、気になったのですが1行ずつ読み込んで改行コードが消えているので text.Append(A);の後に text.Append("\n");を入れたほうがよいと思います。 改行無しでよいならそれでも構わないのですけど。

参考URL:
http://www.microsoft.com/japan/msdn/academic/Articles/fun/02/
nirusu
質問者

お礼

いろいろとアドバスありがとうございました。 今後とも宜しくお願いします。

nirusu
質問者

補足

A = Regex.Replace(A,@">",">\r\n"); A = Regex.Replace(A,@"<(([^>]|\n)*)>",""); として改行するようにはしてます。"\r\n" としないと改行されないのでこうしてます.

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

大文字で書かれていることではなくて、 >が来る前に改行しているからだと思います。 タグのパーサをちゃんとしないで質問文のような簡略な方法では、一般的なHTMLではうまくタグを削除することはできないと思います。

関連するQ&A

  • C#で空白行を削除する方法

    C#でテキストを読み込んで、文字列型の変数に代入、そしてtextBoxに表示させます。その中にいくつかの空白だけの行があります。その空白行だけを削除する方法がわかりません。わかる方がいらっしゃいましたらよろしくお願いします。 FileStream file = File.Open(@"C:\text.txt",FileMode.Open); Encoding enc = Encoding.GetEncoding("Shift_JIS"); StreamReader reader = new StreamReader(file,enc); string A = reader.ReadToEnd(); A = Regex.Replace(A,"\r\n",""); textBox1.Text = A; とすると全ての改行が削除されてしまいます。 正規表現をうまくつかうと出来るような気がするんですが・・・

  • 排他ロックが掛かっているファイルを読み込む

    排他ロックが掛かっている(別のプロセスが使用している) テキストファイルを読み込みたいのですが、 System.IO.FileStreamを実行した後に、IOExceptionエラーが発生し、 読み込みができません。 System.IO.FileStreamにはこだわってませんので、 排他ロックが掛かっているテキストファイルを読み込む方法を ご存知の方は、ご教授頂けませんでしょうか。 宜しくお願いします。 <ソースコード> 'ファイルパス wFullPath = "\\XXX.XXX.XXX.XXX\TEXT\TEST.TXT" (XXX.XXX.XXX.XXX:IPアドレス) 'ファイルを開く Dim fs As New System.IO.FileStream(wFullPath, _ System.IO.FileMode.Open, _ System.IO.FileAccess.ReadWrite, _ System.IO.FileShare.ReadWrite) 'FileStreamを基にしたStringReaderのインスタンスを作成 Dim enc As System.Text.Encoding = _ System.Text.Encoding.GetEncoding("shift_jis") Dim sr As New System.IO.StreamReader(fs, enc) 'ファイルの内容をすべて読み込む Dim s As String = sr.ReadToEnd() <開発環境> 言語:VB.NET Microsoft Visual Studio 2008 Microsoft .NET Framework Version 3.5 SP1

  • C#テキストファイルから1バイト除去する

    数ギガのテキストファイルがあり、語尾の1バイト(EOF)を瞬時に除去したいと思います。 バイトで読んで1バイトのみ出力しないと言う方法が一番簡単ですが、時間がかかる上、巨大ファイルには向きません。 下記語尾を置換するソースを書きましたが、除去の方法がわかりません。初心者ですので、簡単にお願いします。 FileStream fs = new FileStream("test.txt", FileMode.Open); byte[] b = new byte[1]; fs.Seek(fs.Length - 1, SeekOrigin.Begin); fs.Write(b, 0, 1); fs.Close();

  • C#からテキストファイルへの出力について

    お世話になります。 .NET C#で開発をしております。 下記のコードで、テキストファイルへ書き出す際、 何故か最初の1レコード目が書き出されない現象が 起きてしまいます。 どなたかご親切な方、ご教示頂きたく宜しくお願い致します。     記 public static int Syori() { string MitxtPath = @"D:\MData"; string SotxtPath = @"D:\SData"; for (int x = 0; x < 2; x++) { if (x == 0) { FileName = "\\JF01.txt"; } else if (x == 1) { FileName = "\\JS05.txt"; } FileStream fs = new FileStream(MitxtPath + FileName, FileMode.Open); StreamReader r = new StreamReader(fs, Encoding.GetEncoding("Shift_JIS")); if (r.ReadLine() != null) { StreamWriter textFile; textFile = new StreamWriter(SotxtPath + FileName, true, Encoding.GetEncoding("Shift_JIS")); //レコードを書き込む string ZanData; string newData; byte[] bytesData; while ((OkuriNokosi = r.ReadLine()) != null) { bytesData = System.Text.Encoding.GetEncoding(932).GetBytes(ZanData); newData = System.Text.Encoding.GetEncoding(932).GetString(bytesData); textFile.WriteLine(newData); } textFile.Close(); r.Close(); } }

  • C# 読み込んだテキストファイルが文字化けします

    C#初心者です。 ファイルストリームからファイル名を指定して テキストを読み込んで出力しようとしているのですが、 読み込んだテキストが文字化けしてしまいます。 原因を教えていただけないでしょうか。 下記にコードを記述します。 よろしくお願いいたします。 String s = ""; FileStream fip = new FileStream("test.txt", FileMode.OpenOrCreate); StreamReader r_fip = new StreamReader(fip); while (true) { s = r_fip.ReadLine(); if (s == null) break; fld00.AppendText(s); } r_fip.Close();

  • C#でフォルダをロックする方法

    C#でフォルダをロックする方法を教えて下さい。 実現したい挙動は、こんな感じです。 1, コマンドプロンプトで、カレントディレクトリを「C:\test」にする 2, その状態で「C:\test」を削除しようとする 3, 「別のプログラムがこのフォルダを開いているので、操作を完了できません。」(Vistaの場合) つまり、フォルダはコマンドプロンプトのカレントディレクトリになっている間は削除することができませんが、これをコマンドプロンプトではなくプログラムから制御したいのです。(1プログラムで複数) ちなみに、ファイルをロックするのは stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.None); という記述でできましたが、わかっていたことですが、フォルダではやはり失敗します。 よろしくお願いします。

  • C# 動的に読み込んだコントロールの削除

    C#にて動的に読み込んだ不特定多数のコントロールを削除する正しい手順は どのような物でしょうか。 MSDNによるとコンテナに読み込んだコントロールをFlowLayoutPanel.Clear()で クリアするとメモリリークにつながるため、Dispose()をしろとあります。 動的に作成したコントロールが不特定多数のため、Foreach文をつかい FlowLayoutPanel.Controlsで確認できた物をDispose()しましたが、偶数indexの コントロールしか削除されませんでした。 まぁ、これはなんとなく分かるのですが、では、正しくすべてのコントロールを 削除するにはどうしたら良いのか分かりません。 ご教示のほど、よろしくお願いいたします。 確認コード(空のForm1_Loadに貼り付け) ※現象を再現させるためのサンプルで意味はありません // コントロール配置用のコンテナ FlowLayoutPanel panel = new FlowLayoutPanel(); panel.Dock = System.Windows.Forms.DockStyle.Fill; this.Controls.Add(panel); // テストコントロール追加ボタン Button create = new Button(); create.Size = new Size(50, 25); create.Text = "create"; create.Click += (ss, ee) => { for (int i = 0; i < 100; i++) { TextBox text = new TextBox(); text.Size = new Size(50, 25); text.Text = i.ToString(); panel.Controls.Add(text); } }; panel.Controls.Add(create); // コントロール削除ボタン Button delete = new Button(); delete.Size = new Size(50, 25); delete.Text = "delete"; delete.Click += (ss, ee) => { foreach (var control in panel.Controls) { if (control is TextBox) { ((TextBox)control).Dispose(); } } }; panel.Controls.Add(delete);

  • VBのFileStreamについて

    Visual Basicについて質問です。 ファイルをD&Dをするとそのファイルのサイズを表示するプログラムをつくっています。 今まで順調だったのですがいざコンパイルしてやってみるとエラーが出てしまいます。 パスに空白文字が含まれているのが原因だとわかったんですがダブルクオーテーションをつけても治りません。 空白文字のないパスなら成功します。 これはこのプログラムのコードで原因があると思われる部分です。↓ Dim path As String = Command().ToString path.Trim() Dim ifs As FileStream = New FileStream(path, FileMode.Open) 1,FileStreamでは空白文字のあるパスは使えないのですか? 2,この場合はどうやったら対処できますか? どなたかVBに詳しい方、ご教授願います。

  • VB2005でのテキストファイルのアクセス権

    ある条件の下テキストファイルを出力していますが、 出力ファイルを開いた状態で、再度ツールを実行すると 「別のプロセスが・・・アクセスできません。」 というエラーにはじかれてしまいます。 現在VB2005を使用していますが、以前VB6のときはエラーに なりませんでした。 ※Excelの場合はエラーになっていましたけど。 以下私のコードを抜粋 strNewDirはString型でパスが入っています。 Dim stFile As Stream = New FileStream(strNewDir, FileMode.OpenOrCreate) Dim encSJIS As Encoding = Encoding.GetEncoding("shift-jis") Dim swSJIS As StreamWriter = New StreamWriter(stFile, encSJIS) ・・・ swSJIS.Close() という形でファイルアクセスしています。 New FileStreamには[Access]や[Share]などがあるようで、 いろいろ試しましたが、どうもうまくいきません。 ご存知の方いらっしゃいますか?

  • 【C++/CLI】ファイルオープンに失敗した際のエラー処理

    VC++2005の.NETで言語はC++/CLIにてアプリを作成しています。 FileStream^ fs; String^ file; fs = gcnew FileStream( file, FileMode::Open ); にてファイルをオープンする処理を入れたのですが、 ファイルが存在しない、もしくは何らかのエラー等で、 ファイルが正常に開けない場合のエラー処理は、 どのように判断させればよいのでしょうか? 方法をご存知の方おられましたら、参考例などご教示お願い致します。