Microsoft Access 掲示板

あいまいな置換

3 コメント
views

access 365
いつもお世話になっています。
質問がございます。

テーブルが下記のようになっています。
ID
品番
説明文

説明文のフィールド内に HTMLの記述が入っていまして例えば

<table style="width: 100%;">
<tr>
<th style="width:100%;">型式</th>
<td style="width:100%;">AA1111</td>
</tr>
</table>
<span style="color: red;">あああああ</span>

こちらを置換で

<table>
<tr>
<th>型式</th>
<td>AA1111</td>
</tr>
</table>
<span>あああああ</span>

のようにしたいです。

行いたいのは、

replace([説明文],"<table",">","<table>")
replace([説明文],"<th ",">","<th>")
replace([説明文],"<td ",">","<td>")
replace([説明文],"<span ",">","<span>")


のように置換のルールを並べて記載して

※[説明文]にある <talle  から  >  までを <table> に置き換える
※[説明文]にある <th  から  >  までを <th> に置き換える
※[説明文]にある <td  から  >  までを <td> に置き換える
※[説明文]にある <span  から  >  までを <span> に置き換える

同時に置換を行いたいです。

分かりずらい文章で申し訳ございませんがどなたかご教授いただきたく
よろしくお願いします。

<

LAA
作成: 2025/07/25 (金) 15:32:15
最終更新: 2025/07/25 (金) 15:33:21
通報 ...
1

のように置換のルールを並べて記載して

置換対象が「文字列」ではなく「ルール」ですから、VBA.Replace関数での実装は難しいでしょう
別案として 正規表現のUDFを利用する方法をご紹介します

 
■ユーザー定義関数

Public Function LAA_Replace(ByVal html As Variant _
                          , ByVal reg_pattern As String _
                          , ByVal reg_replace As String) As Variant
    LAA_Replace = html
    If (LenB(Nz(html)) = 0) Then Exit Function
    
    With CreateObject("VBScript.RegExp")
        .Global = True
        .IgnoreCase = True
        .Pattern = reg_pattern
        If (.Test(html)) Then
            LAA_Replace = .Replace(html, reg_replace)
        End If
    End With
End Function

 
■SQL ( 文中のテーブル名は実際の名前に置き換えて下さい )

SELECT ID
     , 品番
     , 説明文
     , LAA_Replace( 説明文, "(<(?:table|t[hd]|span))\s[^>]*(>)", "$1$2" ) as タグ指定置換
     , LAA_Replace( 説明文, "(<\w+?)\s[^>]*(>)", "$1$2" ) As タグ無差別置換
FROM テーブル名
ORDER BY 1
;

 
なお、正規表現に馴染みが無い場合は chatGPT あたりを利用し、AI に

vbscript 正規表現 マニュアル

というメッセージを送ってみたり、Grok

vbscript 正規表現 メタ文字

とでも尋ねてみると、それなりの例やマニュアルを提示してくれるでしょう

2
hatena 2025/07/27 (日) 04:02:42 修正

mayuさんから回答があるようにユーザー定義関数を作成することになると思います。

MSはVBScriptは将来的に廃止にする意向のようですのでVBScriptに依存しないものを作成してみました。

Public Function minifizeTags(s As Variant) As Variant
    minifizeTags = s
    If Nz(s) = "" Then Exit Function
    
    Dim ary As Variant
    ary = Split(s, "<")
    
    Dim i As Long, buf As String, p1 As Long, p2 As Long
    For i = 1 To UBound(ary)
        buf = ary(i)
        p1 = InStr(buf, " ")
        p2 = InStr(buf, ">")
        If p1 > 0 And p2 > 0 And p1 < p2 Then
            ary(i) = Left(buf, p1 - 1) & Mid(buf, p2)
        End If
    Next
    minifizeTags = Join(ary, "<")
End Function
3
sk 2025/07/28 (月) 08:20:02 修正 88328@64ac3

「 HTML テキスト内の全ての要素から全ての属性を取り除く」というのが主な目的なのであれば、
「DOM オブジェクトを使用する」という方法も一応は考えられますが、

<table style="width: 100%;">
<tr>
<th style="width:100%;">型式</th>
<td style="width:100%;">AA1111</td>
</tr>
</table>
<span style="color: red;">あああああ</span>

上記のようなテキストを DOM オブジェクトで扱う場合は、以下の点に留意しなければならないでしょう。

  • <html> など最上位のタグで囲まれている状態でパースさせる必要がある。

  • パースされた結果として各行にはインデントが自動的に挿入、調整される。