我有一个脚本,它生成一个以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>
我尝试regex将字体颜色添加到行的开头和末尾,行的末尾以“已传递”结束:$email = [regex]::Replace($email, "<tr><td>(.*?)Delivered</td></tr>", '<tr><font color = green><td>$1Delivered</td></font></tr>')
。
这不起作用(我不确定你是否能为整行设置字体颜色)。
对于如何容易地/有效地做这件事,有什么想法吗?我必须在几个不同的状态下做这件事(比如交付)。
发布于 2013-04-24 03:04:40
免责声明: 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>
的<td>Delivered</td>
元素。这两个捕获组获取<tr>
元素中围绕<td>Delivered</td>
字符串的其他所有内容。注意*
s. *
后面的问号本身是贪婪的,匹配尽可能多的文本;*?
匹配尽可能少的文本。如果我们只在这里使用*
,它将把整个字符串作为一个匹配项来处理,并且只替换第一个<tr>
。
第二个字符串是替换字符串。它使用添加的样式属性将<tr>
元素和它的内容按回位置,所有这些都没有back ref。
另一个次要的音符是引语。无论如何,我倾向于单引号,但在这种情况下,您可能会在替换字符串中使用双引号。所以单引号可能是最好的选择。
至于如何在不同的状态下这样做,正则表达式实际上不是为这样的条件内容而设计的,这就像尝试使用螺丝刀作为演练一样。您可以硬编码几个替换或循环状态/颜色对,并构建您的模式,并从它们替换字符串。如果您能够为.NET找到一个完整的HTML解析器,那么它的效率会更高;如果您能够保证一个XML解析器是有效的,那么您可以尝试使用它。或者,回到我一开始的问题,您可以修改HTML生成。然而,如果你的电子邮件数量很少,这可能不是一个值得解决的瓶颈。所花费的开发时间也是昂贵的。看看它是否足够快,如果不是,尝试另一条路线。
值得称赞的是:我从@FrankieTheKneeMan获得了HTML样式属性。
https://stackoverflow.com/questions/16180055
复制相似问题