htmlタグの属性を正規表現で抽出 への返答
投稿で使用できる特殊コードの説明。(別タブで開きます。)
以下の返答は逆順(新しい順)に並んでいます。
投稿者 Regex  (高校生)
投稿日時
2012/2/21 17:54:47
初めて投稿します。
今VBでhtmlのエディタを作成しているのですが、RichTextboxでタグの色を変えるときに正規表現を使用しています。
そこで、ある程度の色付けは実装できるのですが、タグの中まで詳細に色付けすることが今の能力ではできません。
たとえば <input type="checkbox" checked="true" id="test"> とやった時に、「type=」、「checked=」、「id=」 を取り出して赤に色付けし、「"」から「"」までの範囲を緑で色づけしたいときはどのような正規表現を用いるとできますか?
今のところある程度の色付けに関しては
のような感じで、Rtfプロパティをいじって色を付けています。
このプログラムは http://www.geocities.jp/hatanero/richtext.html を参考に作っています。
正規表現とRtfに詳しい方、回答お願いします。
今VBでhtmlのエディタを作成しているのですが、RichTextboxでタグの色を変えるときに正規表現を使用しています。
そこで、ある程度の色付けは実装できるのですが、タグの中まで詳細に色付けすることが今の能力ではできません。
たとえば <input type="checkbox" checked="true" id="test"> とやった時に、「type=」、「checked=」、「id=」 を取り出して赤に色付けし、「"」から「"」までの範囲を緑で色づけしたいときはどのような正規表現を用いるとできますか?
今のところある程度の色付けに関しては
'カラーテーブルを削除するコード
Dim s As String, ss As String
Dim t1 As Integer, t2 As Integer
s = RithTextBox1.Rtf
t1 = s.IndexOf("{\colortbl")
If t1 > 0 Then
t2 = s.IndexOf("}", t1) 'カラーテーブルが有った場合{の次の}を探す
ss = s.Substring(t1, t2 - t1 + 1) '{から}までを切り出す
s = s.Replace(ss, "") '{から}の文字を空白に置き換える
End If
'\cf0:黒 \cf1:タグ内の色(青) \cf2:「<」と「>」(赤) \cf3:コメントタグの色(緑)
s = Replace(s, "\viewkind", "{\colortbl ;\red255\green0\blue0;\red0\green0\blue255;\red0\green150\blue0;}" & vbCrLf & "\viewkind")
s = Regex.Replace(s, "<(.*?)>", "\cf2<\cf1$1\cf2>\cf0", RegexOptions.IgnoreCase)
s = Regex.Replace(s, "<\\cf1!(.*?)\\cf2>", "\cf3<!$1>\cf0", RegexOptions.IgnoreCase)
RithTextBox1.Rtf = s
のような感じで、Rtfプロパティをいじって色を付けています。
このプログラムは http://www.geocities.jp/hatanero/richtext.html を参考に作っています。
正規表現とRtfに詳しい方、回答お願いします。
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
Dim reg As New Regex("<(?<tagName>.+?)( (?<attrName>.+?)=(?<attrValue>.+?))*>")
TextBox2.Text = reg.Replace(TextBox1.Text, AddressOf MatchEval)
End Sub
Private Function MatchEval(m As Match) As String
Dim strRet As New System.Text.StringBuilder
strRet.Append("<")
strRet.Append(m.Groups("tagName").Value)
Dim capAttrName = m.Groups("attrName").Captures()
Dim capAttrValue = m.Groups("attrValue").Captures()
Dim intIdx = 0
Do While intIdx < capAttrName.Count
strRet.Append(" ")
strRet.AppendFormat("[blue:{0}]", capAttrName(intIdx).Value)
strRet.Append("=")
strRet.AppendFormat("[red:{0}]", capAttrValue(intIdx).Value)
intIdx += 1
Loop
strRet.Append(">")
Return strRet.ToString
End Function