2

クラス 'candidate' を持つ HTML タグをテキスト 'PLACEHOLDER' に置き換えるために、VBScript で Regex を使用しようとしています。ただし、常に機能しているわけではありません。

<[^\>]*class=""[^\>]*candidate[^\>]*""[^\>]*>([\s\S]*?)</[^\>]*>

Flags: IgnoreCase = True, Multiline = True, Global = True

問題は、このクラスが含まれる HTML タグのタイプがわからないことです (たとえば、< div > タグまたは < p > タグである可能性があります)。第 2 に、正規表現は内部の HTML タグでは特にうまく機能しません。

件名 HTML:

<div class="outer">
<div class="normal">
<p><strong><em>Test</em></strong></p>
</div>
<div class="candidate">
<p>Test 1:</p>
<ul>
    <li>Test 2</li>
    <li>Test 3 </li>
    <li>Test 4 </li>
</ul>
<p>Test 5</p>
</div>
<p>Test 6</p>
<div class="normal">
<p><strong>Test 7</strong></p>
</div>
</div>

期待される:

<div class="outer">
<div class="normal">
<p><strong><em>Test</em></strong></p>
</div>
<div class="candidate">
PLACEHOLDER
</div>
<p>Test 6</p>
<div class="normal">
<p><strong>Test 7</strong></p>
</div>
</div>

実際:

<div class="outer">
<div class="normal">
<p><strong><em>Test</em></strong></p>
</div>
<div class="candidate">
PLACEHOLDER
    <li>Test 2</li>
    <li>Test 3 </li>
    <li>Test 4 </li>
</ul>
<p>Test 5</p>
</div>
<p>Test 6</p>
<div class="normal">
<p><strong>Test 7</strong></p>
</div>
</div>

同じ HTML タグには、現在散発的に機能している同じタイプで異なるクラスの内部タグも含まれる場合があります。

例えば:

<div class="candidate">Test<div class="normal">Test</div></div>

どんな助けでも大歓迎です。

4

1 に答える 1

3

正規表現である必要がありますか?このタスクは、 MSHTML(またはその他のHTMLパーサー)を使用すると非常に簡単です。この例では、件名のHTMLを「test.htm」というファイルに入れます。

Option Explicit

Const ForReading = 1

Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")
Dim inFile
Set inFile = fso.OpenTextFile("test.htm", ForReading)

Dim html
Set html = CreateObject("htmlfile")
html.write inFile.ReadAll()
inFile.Close

Dim allElements
Set allElements = html.getElementsByTagName("*")

Dim el
For Each el in allElements
    If (HasClass(el, "candidate")) Then
        el.innerText = "PLACEHOLDER"
    End If
Next

WScript.Echo html.body.outerHtml

' Takes into account the fact that the HTML "class" attribute can
' contain multiple whitespace-delimited classes
Function HasClass(el, className)
    Dim re
    Set re = New RegExp

    re.Pattern = "\b" & className & "\b"
    HasClass = re.Test(el.className)
End Function
于 2012-10-15T06:42:17.037 に答える