htmlのタグについて

解決


VB3日目の超初心者  2005-04-15 11:59:14  No: 120990

VB6.0を使っています。

htmlファイルをリッチテキストボックスに読み込んで
<html><body><br><table>などの全てのHTMLタグを消して
文字だけにしたいのですが・・・・
簡単な方法があればご伝授お願いします。


マグ  2005-04-15 19:35:48  No: 120991

>htmlファイルをリッチテキストボックスに読み込んで
><html><body><br><table>などの全てのHTMLタグを消して
>文字だけにしたいのですが・・・・

どのようにしたいのでしょうか?
タグの効果を適用して表示させたいのですか?
たとえば、<center>実験</center>→真ん中に実験を表示させる。
これは分かりません。

適用しないで表示させる場合、
<を検索し、>を検索して、その範囲をsubstringで消すというのはどうでしょうか。


ねろ  2005-04-15 20:07:55  No: 120992

リッチテキスト上の文字色などの情報は其のまま残すのか否かで
処理が全く別のものになります、その辺はいかがでしょうか。


VB3日目の超初心者  2005-04-16 01:01:07  No: 120993

すみません。
最終的にはタグを全て除去してタグ以外の文字の取得が目的です。
こういう風にプログラムしてみたのですが、半落ち状態になってしまいます。

    Dim SearchST As Long
    Dim SearchED As Long
    Dim SearchTotal As Long
    Dim SearchTemp As String
    Dim SearchTemp1 As String
Do
    SearchST = InStr(1, RichTextBox2.Text, "<", vbTextCompare)

    If SearchST = 0 Then
        GoTo OK10
    End If
    
    SearchED = InStr(SearchST, RichTextBox2.Text, ">", vbTextCompare)
    SearchTotal = SearchED - SearchST
    SearchTemp = Mid(RichTextBox2.Text, SearchST, SearchTotal + 1)
    SearchTemp1 = RichTextBox2.Find(SearchTemp)
    RichTextBox2.SelText = ""
    
Loop
OK10:


ねろ  2005-04-16 02:03:42  No: 120994

『GoTo OK10』 は  『Exit Do』  の方がいいかな。
でも特におかしいところは無さそうですが、大きなファイルを
変換してただ時間がかかっているだけでは。
どこかに DoEvents  を入れとけば、ぱらぱら変わっていくところが
見られると思うのですが。


マグ  2005-04-16 02:29:16  No: 120995

ところで、なぜ、Do〜Loop。
For〜Nextで終了をRichTextBoxの文字長さで指定すればいいような気が・・・・・

まずは、単純なHTMLのソースで出来ているかどうかを試してみては?
例えば、このように

<HTML lang="ja">
<HEAD><TITLE>Sample</TITLE></HEAD>
<BODY>Test</BODY>
</HTML>


それは  2005-04-16 02:39:46  No: 120996

>ところで、なぜ、Do〜Loop。
>For〜Nextで終了をRichTextBoxの文字長さで指定すればいいような気が・・・・・

VB3日目の超初心者さんはClikeなんじゃない?
ねろさんの言う通りexit Doにすればいいかと。


ねろ  2005-04-16 03:09:33  No: 120997

マグさん
>For〜Nextで終了をRichTextBoxの文字長さで指定すればいいような気が
それはだめでしょう、RichTextBoxの長さがFor〜Nextの中で短くなっていきますよ。

ちょっと変わった方法ですが
Dim Flg As Boolean
Dim s As String
Dim i As Long
s = RichTextBox2.Text
For i = 1 To Len(s)
    If Mid(s, i, 1) = "<" Then
        Flg = True
        Mid(s, i, 1) = Chr(2) 'ありえない文字に取り合えず変換
    ElseIf Mid(s, i, 1) = ">" Then
        Flg = False
        Mid(s, i, 1) = Chr(2)
    ElseIf Flg Then
        Mid(s, i, 1) = Chr(2)
    End If
 Next
 RichTextBox2.Text = Replace(s, Chr(2), "")
こんな方法もあります。
長さが変わらない様に、通常では存在しない文字Chr(2)に
置き換えておいて一気に変換します。
文字列の足し算をしないので、結構高速です。


VB3日目の超初心者  2005-04-16 04:21:56  No: 120998

貴重なアドバイスありがとうございました
かなりの高速でタグを除去できました。


ガッ  2005-04-16 04:47:38  No: 120999

重箱の隅をつつくようだけど…
<hoge a="<hogehoge"><foo a="abcdeM>">
…とかは…無視?


ねろ  2005-04-16 05:28:04  No: 121000

こんなのも有るかな。
<!-- <hoge>hogehoge</hoge> -->
ま、考え方ということでひとつ。


私も  2005-04-16 14:09:10  No: 121001

最初に思いついたのは
DOMのinnertxtを使うことかな?
http://tomizawa-web.hp.infoseek.co.jp/index.htm

でも、ロジックでできるならすばらしいことで・・・
尊敬します。


マグ  2005-04-17 03:53:56  No: 121002

>それはだめでしょう、RichTextBoxの長さがFor〜Nextの中で短くなっていきますよ。

プログラムを組むとき、このようなことをしていたのですが。
このような方法ってだめなのでしょうか?
知りませんでした。
今後、気をつけます。


マグ  2005-04-17 03:58:58  No: 121003

例えば、Rtfを編集するこのような方法もあります。

        'Dim mozi As String, hani As String  'VB6版の宣言
        'Dim Start As Long, Finish As Long   'VB6版の宣言
        Dim mozi As String, hani As String       'VB.NET版の宣言
        Dim Start As Integer, Finish As Integer  'VB.NET版の宣言

        Dim i As Integer,LLength As Integer
  LLength=RichTextBox2.Text.Length
        For i = 0 To LLength
            'mozi = RichTextBox2.TextRTF   'VB6版のRtf読み込み
            mozi = RichTextBox2.Rtf     'VB.NET版のRtf読み込み

            Start = InStr(mozi, "<")
            If Start <> 0 Then
                Finish = InStr(Start, mozi, ">")
                hani = Mid(mozi, Start, Finish - Start + 1)
                mozi = Replace(mozi, hani, "")
            Else
                Exit For
            End If

            'RichTextBox2.TextRTF= mozi  'VB6版のRtf書き込み
            RichTextBox2.Rtf = mozi     'VB.NET版の書き込み
        Next

VB6の環境がなかったので、VB.NETで確認しました。


ねろ  2005-04-18 17:49:38  No: 121004

マグさん。
>最終的にはタグを全て除去してタグ以外の文字の取得が目的です。
と書いてありますよ、Rtfで無くても良いのでは。

>LLength=RichTextBox2.Text.Length
>For i = 0 To LLength
これはどのような意図でしょうか、Forの中でRichTextBox2.Text.Lengthが
変わっています、しかも変えようとしているのはRtfだし。。。。。
他人が読んだ場合意図がわかりにくい。

この場合Forのループは必ず Exit Forで抜けますから、Forの必要は全く無いのでは。

Forのループの中で
>RichTextBox2.Rtf = mozi     'VB.NET版の書き込み
とやっていますが、せっかくmoziに置き換えているのだから、
最後に置き換えれば良いのでは、リッチテキストのRtfに文字を入れることは
それだけでかなり時間がかかります。

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  Dim strRtbTxt, strTobeChanged As String
  Dim intStart, intEnd As Integer
  strRtbTxt = RichTextBox2.Text
  Do
    intStart = InStr(strRtbTxt, "<")
    intEnd = InStr(strRtbTxt, ">")
    If (intStart <> 0) AndAlso (intStart < intEnd) Then                      '順番と有り無しをチェック
      strTobeChanged = Mid(strRtbTxt, intStart, intEnd - intStart + 1) 'タグを切り出す
      strRtbTxt = Replace(strRtbTxt, strTobeChanged, "")                'タグを消す
    Else
      Exit Do
    End If
  Loop
  RichTextBox2.Text = strRtbTxt
End Sub
こんなかな。


マグ  2005-04-18 18:18:03  No: 121005

>>LLength=RichTextBox2.Text.Length
>>For i = 0 To LLength
>これはどのような意図でしょうか、Forの中でRichTextBox2.Text.Lengthが
>変わっています、しかも変えようとしているのはRtfだし。。。。。
>他人が読んだ場合意図がわかりにくい。

これは、For文でループ中文字の長さが変更されていくのを防ぐためです。

>>RichTextBox2.Rtf = mozi     'VB.NET版の書き込み
>とやっていますが、せっかくmoziに置き換えているのだから、
>最後に置き換えれば良いのでは、リッチテキストのRtfに文字を入れることは
>それだけでかなり時間がかかります。

そうですね。
moziの内容をTextの入れるのは最後にしたほうが速くなりますね。

>この場合Forのループは必ず Exit Forで抜けますから、Forの必要は全く無いのでは。

繰り返し処理はFor文しか知らなかったんです。
でも、Do〜Loopの使い方も分かりました。
勉強になりました。ありがとうございます。


ねろ  2005-04-18 23:59:58  No: 121006

>繰り返し処理はFor文しか知らなかったんです。
え!?
悪いことは言いません、転ばない前に多少は基礎を
勉強することよろし。


マグ  2005-04-19 01:30:25  No: 121007

>え!?
>悪いことは言いません、転ばない前に多少は基礎を
>勉強することよろし。

基本を知らなさすぎなのは、知っています。
プログラムを解析してて、知らない構文とか出てきたりしますからね。
とりあえず、基本は今のところ、地道に習得中です。


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加