C#でHTMLファイルをpreタグを残して加工する方法

このQ&Aのポイント
  • C#でhtmlファイルのタグを解析するプログラムを作成している際、preタグがある場合にその場所を回避し、解析や置換を行いたい場合、正規表現を使用する方法があります。
  • 普通に改行を取り除くとpreタグの中も一列になってしまうため、preタグの中以外のみ改行を取り除くようにします。
  • 上記のようなファイルがあった場合、正規表現を使用してpreタグ以外の改行を取り除き、preタグの中の改行を維持することができます。
回答を見る
  • ベストアンサー

C# htmlファイルを、preタグを残して加工

お世話になります。 C#で、htmlファイルのタグを解析するプログラムを 組んでいるのですが、preタグがあった場合のに、その場所を 回避して、解析やら置換やらをしたいと思っています。 例でいうと ---------------- <div> <h1>こんにちは。</h1> <p> 今日も暑いですね。 </p> <p>本日のサンプルプログラムです。</p> <code> <pre> public void aaa() { // 文字列を表示する Console.Writeline("Hello World!"); } </pre> </code> </div> ---------------- 上記のようなファイルがあった場合、普通に 改行を取り除くと、preの中も一列に繋がってしまいますが、 これをpreタグの中以外のみ改行を取り除きたい。 ---------------- <div><h1>こんにちは。</h1><p>今日も暑いですね。</p><p>本日のサンプルプログラムです。</p><code> <pre> public void aaa() { // 文字列を表示する Console.Writeline("Hello World!"); } </pre> </code></div> ---------------- こうなってもらいたいのです。 正規表現などを使用するのだと思いますが、よくわかりませんでした。 この部分のサンプルなどをお教えいただけないでしょうか。 よろしくお願いいたします。

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

  • ベストアンサー
  • oboroxx
  • ベストアンサー率40% (317/792)
回答No.2

Regex reg = new Regex("(?<pre><pre[^>]*>.*</pre>)|(<(\"[^\"]*\"|'[^']*'|[^\"'])*?>)|(?<sentense>[^<>\r\n]+)", RegexOptions.Singleline); を Regex reg = new Regex("(?<pre><pre[^>]*>.*?</pre>)|(<(\"[^\"]*\"|'[^']*'|[^\"'])*?>)|(?<sentense>[^<>\r\n]+)", RegexOptions.Singleline); に置き換えてみてください。

tatapatank
質問者

お礼

度々すみませんでした。 いただいた内容では、どこも変わっていないようですが…。 ただ、処理自体は合っていたようです。誤解をし、 申し訳ありませんでした。 いただいた回答をもとに、再度勉強させていただきます。 ありがとうございました。

その他の回答 (1)

  • oboroxx
  • ベストアンサー率40% (317/792)
回答No.1

こんな感じでしょうか。 public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { OpenFileDialog ofd = new OpenFileDialog(); if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK) { string f = ofd.FileName; Encoding en = Encoding.GetEncoding("shift-jis"); StreamReader sr = new StreamReader(f, en); string text = sr.ReadToEnd(); sr.Close(); Regex reg = new Regex("(?<pre><pre[^>]*>.*</pre>)|(<(\"[^\"]*\"|'[^']*'|[^\"'])*?>)|(?<sentense>[^<>\r\n]+)", RegexOptions.Singleline); MatchCollection mc = reg.Matches(text); foreach (Match m in mc) { this.textBox1.Text += m.Groups[1].Value + m.Groups["pre"].Value + m.Groups["sentense"].Value; } } } }

参考URL:
http://www.oborodukiyo.info/RE/VS2010/RE-Main.aspx
tatapatank
質問者

補足

ご返答、ありがとうございます。 せっかくですが、いただいた方法ですと、 文中にいくつものpreタグがある場合、最初のpre開始タグと 最後の/pre終了タグを大きな塊とみてしまい、正しく 変換できませんでした。 また、何しろ初心者なもので、正規表現の中が 解析できませんでした。 すみませんが、もう一度手ほどきをお願いできますでしょうか。 よろしくお願いいたします。

関連するQ&A

  • C#でコンパイルができない。

    C#のベータ版をセットアップして以下のサンプルプログラムを コンパイルしたところ、エラーがでました。何がいけないのでしょうか?OSはWin98です。 css001.cs(7,3): error CS0117: 'System.Console' does not contain a definition for 'Writeline' using System; プログラムリスト public class CSS001 { public static void Main(string[] args) { Console.Writeline("Hello World"); } }

  • タグを変えずに改行をなくすにはどうすればいいでし

    cssを何も設定してない状態で <p>aaa</p><div>bbb</div> <span>aaa</span><div>bbb</div> とすると、 ******************** aaa bbb aaa bbb ******************** となってしまいます。 理想は、 ******************** aaabbb aaabbb ******************** です。 <div> の前は必ず開業になってしまうのでしょうか? タグを変えずに改行をなくすにはどうすればいいでしょうか?

    • ベストアンサー
    • HTML
  • C#の変数の範囲

    C#の変数の範囲 質問させてください。 以下は、ネットに掲載されていたC#の問題です。 ~ここから~ 下記のC#のコードを実行した場合、"Hello World!"と二行表示されます。 using System; class Program { static void Main(string[] args) { string s = "Hello"; Action a = () => Console.WriteLine(s); s += " World!"; a(); Console.WriteLine(s); } これを一行目だけ"Hello"と表示される場合、 Action a = () => Console.WriteLine(s);をどう書き換えればよいでしょうか。 1. Action a = () => Console.WriteLine("Hello!"); 2. Action<string> a = (s) => Console.WriteLine(s); 3. Action a = () => Console.WriteLine(t - " World!"); 4. string t = s; Action a = () => Console.WriteLine(t); 5. Action a = () => { string t = s; Console.WriteLine(t); }; ~ここまで~ 正解は4だそうですが、「何故」そうなるかがわかりません。 汗 私としては、1.4.も題意を満たす気がするのですが・・・。 お知恵をお貸しください。 出展 http://www.atmarkit.co.jp/fdotnet/extremecs/extremecs_07/extremecs_07_10.html

  • 段落タグ<p>について教えてください。

    昔、どこかのサイトで<p>タグは必要不可欠のものだ、との記述を見たことがあります。例えば <h1>タイトル</h1> <h2>サブタイトル</h2> <p>説明文</p> のように。必ず<p>タグで文章をくくらなければいけない、 というのが、『本来』の規則なのでしょうか。(←質問1) もしそうだとして、テーブルやリストなども<p>でくくるのですか? (↑質問2) また、<div>を使い1つの段落をブロックとしてまとめる(?)ときも<p>を使うのでしょうか、それは<div>の外側と内側、どちらに書くべきですか?(←質問3) 上記の質問はインライン要素、ブロック要素というようなものと関係があるのですか?(←質問4) 最後に、複数の改行を行うとき、<br>の連続は禁止されていますが、スペースだけの段落で改行を演じるのはどうなのでしょうか。(質問5) 長くなりましたが、簡単にでいいのでよろしくお願いします。

  • Visual C++ 2008 Express Editionの”hello worldのプログラム”

    CUIのプロジェクト作成で自動的に // cui_test.cpp : メイン プロジェクト ファイルです。 #include "stdafx.h" using namespace System; int main(array<System::String ^> ^args) { Console::WriteLine(L"Hello World"); return 0; } このようなプログラミングができて一つ疑問ができたのですが、 ”Console::WriteLine(L"Hello World");” System::Console:: のメソッドの中にある ”WriteLine(L"Hello World");” なぜ”(L"Hello World")”という引数の書き方をしているのですか? ”L”と”"Hello World"”というのは別々の引数として登録しているのでしょうか? オブジェクトブラウザでSystem::Console:: WriteLineを検索したのですが、18種類あってどれを使っているのかわかりません。 教えてくださいよろしくお願いいたします。

  • イメージタグはタグで囲むべき?

    CSSを使ってサイトを作成しています。 気になった事があったので質問させてください。 テキスト(文字)を入力する祭は、<p>~</p>・<div>~</div>等のタグで囲むかと思います。 <img src="" width="" height="" alt="" /> 上記のようなイメージタグは、<p>~</p>・<div>~</div>等で囲む必要はあるのでしょうか? 囲まなくてはいけないものなのでしょうか? <p>~</p>・<div>~</div>タグにスタイルをつけていなければ、 囲んでも囲まなくても表示は変わりませんが、HTML的というか文法的に囲むべきなのでしょうか? ※<p>タグは「reset.css」で上下改行なしにしてあります。 宜しくお願いします。

    • ベストアンサー
    • CSS
  • C#について

    using System; class AddressBook: PhoneBook { private string address; public AddressBook() : base() { address=""; } public void Input() { base.Input(); Console.Write("住所?"); string address=Console.ReadLine(); } public void Writes() { base.Write(); Console.WriteLine("住所:{0}",address); } } class kadai62 { public static void Main() { Console.Write("電話帳に入力する人数を入れてください:"); int n = int.Parse(Console.ReadLine()); AddressBook[] pb = new AddressBook[n]; int i; for (i = 0; i < pb.Length; i++) { pb[i] = new AddressBook(); Console.WriteLine("{0}番目を入力してください.", i+1); pb[i].Input(); } Console.WriteLine(); while(true) { Console.Write("どこから探しますか?[1:氏名,2:自宅電話,3:携帯電話,0:終了] "); int t = int.Parse(Console.ReadLine()); if (t == 0) break; Console.Write("探す文字列は?"); string s = Console.ReadLine(); for (i = 0; i < pb.Length; i++) { if (pb[i].Search(t, s)) pb[i].Writes(); } } } } このプログラムで public void Writes() { base.Write(); Console.WriteLine("住所:{0}",address); } のaddressが出力されません・・どうすれば 出力されますか?

  • 開始タグと終了タグについて

    開始タグと終了タグについて ものすごく初歩的な質問で失礼します。 <div id="container"> <div id="header"> </div> <div id="menu"> </div> <div class="main-top-img"> </div> <div class="main-middle-img"> <div id="main-contents"> <div class="text"> <h2 class="title"></h2> <p class="text"></p> <h3 class="subtitle"> <p class="text"></p> </div> </div> <div class="main-bottom-img"> </div> <div id="footer"> </div> </div> などいのように開始タグと終了タグの間に、他の多くの<div>要素がある場合、どこがその要素の終了タグなのか分からなくなります。 それぞれの開始タグが、それぞれの終了タグと対応するのは、どのようなルールのもとに決定されているのですか??

    • ベストアンサー
    • HTML
  • C#のメンバ変数について

    下記のコードで enterName の変数を static void Resurut() のメソッドへの受け渡しが上手くいかず、どなたか修正点を教えて頂けないでしょうか? 【ソースコード】 static class Program { static string enterName; static int cntWin = 0; //勝利回数 static int cntLose = 0; //敗北回数 static int cntDraw = 0; //引分回数 //ユーザー名の入力 static void Main(string[] args) { string enterName = Console.ReadLine(); Console.WriteLine("ユーザ名を入力してください: {0}", enterName); Start(); Resurut(); } *一部省略 static void Resurut() { if (cntWin > cntLose) { Console.WriteLine("{0}さんの総合勝利です", enterName); } else if (cntLose > cntWin) { Console.WriteLine("CPUの総合勝利です"); } else if (cntWin == cntLose) { Console.WriteLine("引き分けです"); } } }

  • c#でサンプルゲームを作ってみた

    c#でサンプルゲームを作ってみたのですがエラーがでるので間違っている所を指摘してくださいm(__)m using System; class test1 { public int HP; public int ATK; public int DF; } public class test2 { public static void Main() { test1 player1 = new test1(); test1 player2 = new test1(); player1.HP = 150; player2.HP = 150; char ch; char ken; char zyuu; char chois; int buki; for(;;){ do{ Console.WriteLine(" 使う武器を選んでください"); Console.WriteLine("¥n"); Console.WriteLine(" 1. 刀 "); Console.WriteLine("¥n"); Console.WriteLine(" 2. 拳銃 "); Console.WriteLine("¥n"); Console.WriteLine(" 3. 素手 "); Console.WriteLine(" 終了させたい場合は e"); do{ ch = (char) Console.Read(); } while(ch == '¥n' | ch == '¥r'); }while(ch < '1' | ch > '3' & ch != 'n'); if(ch == 'n') break; Console.WriteLine("¥n"); switch(ch){ case '1': Console.WriteLine(" どの刀を使いますか?"); Console.WriteLine(" 1. 太刀"); Console.WriteLine(" 2薙刀"); ken = (char) Console.Read(); while(ken == '¥n' | ken == '¥r'); Console.WriteLine("¥n"); switch(ken){ case '1': buki = 15; break; case '2': buki = 14; break; } case '2': Console.WriteLine(" どの銃を使いますか?"); Console.WriteLine(" 1.マシンガン"); Console.WriteLine(" 2.リボルバー"); zyuu = (char) Console.Read(); while(zyuu == '¥n' | zyuu == '¥r'); Console.WriteLine("¥n"); switch(zyuu){ case'1': buki = 10; break; case'2': buki = 15; break; } case'3': buki = 8; break; } Console.WriteLine("敵が現れた!"); for(;;){ if(plyer1.HP < 0) break; else(player2.HP < 0 ) break; Console.WriteLine(" 1.攻撃¥n 2.防御"); chois = (char) Console.Read(); while(chois == '¥n' | chois == '¥r'); Console.WriteLine("¥n"); switch(chois){ case'1': Console.WriteLine("player1の攻撃!!"); player2.HP = player2.HP - (buki + 10) - 5; Console.WriteLine("%d, player2.HP") ; Console.WriteLine("player2の攻撃!!"); player1.HP = player1.HP - (20 - 5); break; case'2': Console.WriteLine(" player1はガードした!!"); Console.WriteLine("player2の攻撃!!"); Console.WriteLine(" しかしplayer1は攻撃を防いだ!"); break; } } } } }

専門家に質問してみよう