VB6.0を使っています。
htmlファイルをリッチテキストボックスに読み込んで
<html><body><br><table>などの全てのHTMLタグを消して
文字だけにしたいのですが・・・・
簡単な方法があればご伝授お願いします。
>htmlファイルをリッチテキストボックスに読み込んで
><html><body><br><table>などの全てのHTMLタグを消して
>文字だけにしたいのですが・・・・
どのようにしたいのでしょうか?
タグの効果を適用して表示させたいのですか?
たとえば、<center>実験</center>→真ん中に実験を表示させる。
これは分かりません。
適用しないで表示させる場合、
<を検索し、>を検索して、その範囲をsubstringで消すというのはどうでしょうか。
リッチテキスト上の文字色などの情報は其のまま残すのか否かで
処理が全く別のものになります、その辺はいかがでしょうか。
すみません。
最終的にはタグを全て除去してタグ以外の文字の取得が目的です。
こういう風にプログラムしてみたのですが、半落ち状態になってしまいます。
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:
『GoTo OK10』 は 『Exit Do』 の方がいいかな。
でも特におかしいところは無さそうですが、大きなファイルを
変換してただ時間がかかっているだけでは。
どこかに DoEvents を入れとけば、ぱらぱら変わっていくところが
見られると思うのですが。
ところで、なぜ、Do〜Loop。
For〜Nextで終了をRichTextBoxの文字長さで指定すればいいような気が・・・・・
まずは、単純なHTMLのソースで出来ているかどうかを試してみては?
例えば、このように
<HTML lang="ja">
<HEAD><TITLE>Sample</TITLE></HEAD>
<BODY>Test</BODY>
</HTML>
>ところで、なぜ、Do〜Loop。
>For〜Nextで終了をRichTextBoxの文字長さで指定すればいいような気が・・・・・
VB3日目の超初心者さんはClikeなんじゃない?
ねろさんの言う通りexit Doにすればいいかと。
マグさん
>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)に
置き換えておいて一気に変換します。
文字列の足し算をしないので、結構高速です。
貴重なアドバイスありがとうございました
かなりの高速でタグを除去できました。
重箱の隅をつつくようだけど…
<hoge a="<hogehoge"><foo a="abcdeM>">
…とかは…無視?
こんなのも有るかな。
<!-- <hoge>hogehoge</hoge> -->
ま、考え方ということでひとつ。
最初に思いついたのは
DOMのinnertxtを使うことかな?
http://tomizawa-web.hp.infoseek.co.jp/index.htm
でも、ロジックでできるならすばらしいことで・・・
尊敬します。
>それはだめでしょう、RichTextBoxの長さがFor〜Nextの中で短くなっていきますよ。
プログラムを組むとき、このようなことをしていたのですが。
このような方法ってだめなのでしょうか?
知りませんでした。
今後、気をつけます。
例えば、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で確認しました。
マグさん。
>最終的にはタグを全て除去してタグ以外の文字の取得が目的です。
と書いてありますよ、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
こんなかな。
>>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の使い方も分かりました。
勉強になりました。ありがとうございます。
>繰り返し処理はFor文しか知らなかったんです。
え!?
悪いことは言いません、転ばない前に多少は基礎を
勉強することよろし。
>え!?
>悪いことは言いません、転ばない前に多少は基礎を
>勉強することよろし。
基本を知らなさすぎなのは、知っています。
プログラムを解析してて、知らない構文とか出てきたりしますからね。
とりあえず、基本は今のところ、地道に習得中です。
ツイート | ![]() |