我有一个脚本可以生成一系列对象,我希望以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)上进行操作
答案 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样式属性。