2012-10-15 66 views
2

我試圖在VBScript中使用正則表達式來替換具有文本'PLACEHOLDER'的'候選'類的HTML標記。但是,這並不總是奏效。用VBScript替換HTML正則表達式

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

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

的問題是,我不知道是什麼類型的HTML標籤將包含這個類(例如,這可能是一個< div>標籤或< p>標籤)。其次,正則表達式在內部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標籤也可以具有相同的類型,但不同類的其內標籤目前零星工作。

e.g:

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

任何幫助將極大地讚賞。

回答

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 
+1

+1暗示的適應方法,而不是使用Regex_的_Golden錘(+2 INT,-2 WIS) – AutomatedChaos