2013-04-23 100 views
1

我有一個腳本,用於生成我想以HTML格式發送出去的對象數組。這部分工作正常。我正在嘗試修改HTML字符串以使某些行具有不同的字體顏色。 HTML字符串的Powershell從ConvertTo-HTML修改HTML

部分看起來是這樣的(只有2行):

<tr> 
    <td>ABL - Branch5206 Daily OD Report</td> 
    <td>'\\CTB052\Shared_Files\FIS-BIC Reporting\Report Output Files\ABL\Operations\Daily\ABL - Branch5206 Daily OD Report.pdf'</td> 
    <td>13124</td> 
    <td>4/23/2013 8:05:34 AM</td> 
    <td>29134</td> 
    <td>0</td> 
    <td>Delivered</td> 
</tr> 

<tr> 
    <td>ABL - Branch5206 Daily OD Report</td> 
    <td>'\\CTB052\Shared_Files\FIS-BIC Reporting\Report Output Files\ABL\Operations\Daily\ABL - Branch5206 Daily OD Report.xls'</td> 
    <td>15716</td> 
    <td>4/23/2013 8:05:34 AM</td> 
    <td>29134</td> 
    <td>0</td> 
    <td>Delivered</td> 
</tr> 

我想正則表達式的字體顏色添加到開始,其中行以「交付」結束行的結束: $email = [regex]::Replace($email, "<tr><td>(.*?)Delivered</td></tr>", '<tr><font color = green><td>$1Delivered</td></font></tr>')

這沒有奏效(我不知道你是否可以像這樣設置整行的字體顏色)。

關於如何輕鬆/有效地做到這一點的任何想法?我必須在幾個不同的狀態(如Delivered)上執行此操作。

+1

嘗試'(((!!))。)* Delivered)'作爲您的RegEx字符串和' $ 1'作爲替換字符串。如果有效,我會將其作爲答案提交併解釋原因。不幸的是,我不知道PowerShell,所以我正在接觸。 – FrankieTheKneeMan 2013-04-23 23:11:20

+0

這使得整個桌子變紅,而不僅僅是一排。 – user1612851 2013-04-24 14:34:43

+0

我決定把它作爲一個單獨的表(使用Where-object)來分解每個狀態。我認爲這更有意義,我不想花費大量時間來格式化。我可以通過這種方式更容易地改變顏色,但是可能沒有必要這樣做,因爲標題真的會讓每個狀態都出現。 – user1612851 2013-04-24 15:39:33

回答

1

聲明:HTML 不能由通過正則表達式解析器進行解析。正則表達式不會爲這個問題提供一個通用的解決方案。如果您的HTML結構是衆所周知的,並且您沒有任何其他<tr></tr>元素,則以下內容可能會有效。不過,在那個說明中,是否有一些原因,你不能修改HTML代來做到這一點,而不是等到HTML已經生成了?

嘗試此命令:

PS > $email = $email -replace '(?s)<tr>(.*?)<td>Delivered</td>(.*?)</tr>','<tr style="color: #FF0000">$1<td>Delivered</td>$2</tr>' 

第一字符串是圖案。 (?s)告訴解析器允許.接受換行符;這被稱爲「單線」模式。然後它抓取包含字符串<td>Delivered</td><tr>元素。兩個捕獲組抓取圍繞<td>Delivered</td>字符串的<tr>元素中的所有其他內容。注意*之後的問號。 *本身是貪婪的並且匹配儘可能多的文本; *?儘可能少地匹配文本。如果我們在這裏只使用*,它會將您的整個字符串視爲一個匹配項,並僅替換第一個<tr>

第二個字符串是替換。它將<tr>元素及其內容放回原位,並添加了一個樣式屬性,並且全部沒有後退參考。

另一個小調是引用。無論如何,我傾向於使用單引號,但在這種情況下,您可能會在替換字符串中使用雙引號。所以單引號可能是要走的路。

至於如何做到這一點對於不同的狀態,正則表達式實際上並不是爲像這樣的條件內容設計的;這就像試圖用螺絲刀作爲鑽頭一樣。你可以硬編碼幾個替換或循環狀態/顏色對,並建立你的模式,並從中替換字符串。如果你能找到一個用於.NET的完整的HTML解析器將會更有效率;如果您可以保證它是有效的XML,那麼您可以嘗試脫離XML解析器。或者,在開始時回到我的問題,您可以修改HTML代。如果您的電子郵件數量不多,但這可能不是一個值得處理的瓶頸。花費的開發時間也很昂貴。看看它是否足夠快,如果不是,嘗試不同的路線。

歸功於它的原因:我從@FrankieTheKneeMan處取得了HTML樣式屬性。

+0

我將顏色設爲綠色,但使用了您的代碼。它使標題行變成綠色,大部分但不是所有交付的行都變成綠色,而其他一些狀態變成綠色。我認爲這可以工作,我只是在正確的地方得到正確的HTML。我對html很少,這是問題的一部分。我只是爲了改變「交付」的顏色而工作。 – user1612851 2013-04-24 14:40:21

+0

至於預處理,我不太瞭解html,所以我想盡量避免從頭開始自己動手。我也嘗試把代碼放在實際的PowerShell對象屬性中,但是ConvertHTML搞砸了這些。我嘗試在第一個字段前綴與顏色樣式和最後一個字段後綴與顏色樣式。 – user1612851 2013-04-24 14:43:30

+0

你還沒有告訴我們你的數據是如何構建的,或者你如何將它轉換爲HTML。 ConvertHTML函數來自哪裏?你能指出一些文件嗎? – jpmc26 2013-04-24 18:29:12