Powershell从ConvertTo-HTML修改HTML

时间:2013-04-23 22:10:43

标签: html regex powershell-v2.0

我有一个脚本可以生成一系列对象,我希望以HTML格式发送电子邮件。那部分工作正常。我试图修改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>

我尝试使用正则表达式将行字体颜色添加到行以“Delivered”结尾的行的开头和结尾: $email = [regex]::Replace($email, "<tr><td>(.*?)Delivered</td></tr>", '<tr><font color = green><td>$1Delivered</td></font></tr>')

这不起作用(我不确定你是否可以像这样设置整行的字体颜色。)

有关如何轻松/高效地完成此任务的任何想法?我必须在几种不同的状态(如Delivered)上进行操作

1 个答案:

答案 0 :(得分: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)告诉解析器允许.接受换行符;这称为“单线”模式。然后它抓取包含字符串<tr>的{​​{1}}元素。两个捕获组会抓取<td>Delivered</td>字符串周围<tr>元素中的所有其他内容。记下<td>Delivered</td>之后的问号。 *本身就是贪婪的,尽可能多地匹配文本; *匹配尽可能少的文本。如果我们在这里使用*?,它会将整个字符串视为一个匹配项,并且仅替换第一个*

第二个字符串是替换字符串。它使用添加的样式属性将<tr>元素及其内容重新放回原位,并且所有元素都没有后退参考。

另一个小调是引用。无论如何我倾向于单引号,但在这种情况下,你可能在替换字符串中有双引号。所以单引号可能就是这样。

至于如何针对不同的状态执行此操作,正则表达式实际上并非设计用于这样的条件内容;这就像试图用螺丝刀作为钻头。您可以硬编码几个替换或循环状态/颜色对,并构建您的模式并从中替换字符串。如果你能找到一个用于.NET的完整的HTML解析器会更有效率;如果可以保证它是有效的XML,你可能会尝试使用XML解析器。或者,回到开头的问题,您可以修改HTML生成。但是,如果您的电子邮件数量很少,这可能不是一个值得解决的瓶颈。花费的开发时间也很昂贵。看看它是否足够快,如果没有,请尝试不同的路线。

归功于它应有的位置:我从@FrankieTheKneeMan获取了HTML样式属性。