1

我有一个脚本,它生成一组我想以 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>

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

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

关于如何轻松/有效地做到这一点的任何想法?我必须在几种不同的状态下执行此操作(例如已交付)

4

1 回答 1

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>包含字符串的元素<td>Delivered</td>。两个捕获组抓取字符串<tr>周围元素中的所有其他内容。<td>Delivered</td>注意 s 后面的问号**本身就是贪婪的,并且匹配尽可能多的文本;*?匹配尽可能少的文本。如果我们只是*在这里使用,它会将您的整个字符串视为一个匹配项,并且只替换第一个<tr>.

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

另一个小注意事项是引用。无论如何,我倾向于使用单引号,但在这种情况下,您可能会在替换字符串中使用双引号。所以单引号可能是要走的路。

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

应得的信用:我从@FrankieTheKneeMan 获取了 HTML 样式属性。

于 2013-04-24T03:04:40.620 回答