在html中导出特定的字符

时间:2018-03-06 17:54:50

标签: html powershell

我想通过powershell将数据哈希表导出到html,但ConvertTo-HTML命令似乎不会导出某些字符。

例如:

如果我有一个包含字符"<"的字符串的表,那么该表将导出如下所示的行:

<tr><td>&lt;</td></tr>

使用我当前的方法,有没有办法可以导出这些字符,而不必在之后编辑我的HTML文档?

编辑:

我正在尝试使用ConvertTo-HTML创建一个HTML页面,其中包含从SQL服务器中提取的信息。我能够做到这一点,但路障试图用与当前列中的图像路径对应的图像替换其中一个表格列。我需要编辑这些图像,以便它们实际显示在网站上,并插入实际的html代码,这是我考虑的方式。

我研究了导出HTML文档后编辑HTML文档的另一种方法,这种方法大部分都有效,但我最终得到的HTML文档没有<html><body>,甚至{ {1}}。

导出代码的第一行:

<table>

我尝试使用秒的方法可以在这里找到:

https://social.technet.microsoft.com/Forums/windowsserver/en-US/8a3c8dc5-169c-4b61-9bc3-672a7d1e31b3/powershell-to-open-and-edit-html-file?forum=winserverpowershell

2 个答案:

答案 0 :(得分:0)

Convert-ToHTML返回一个字符串,然后可以在将其写入文件之前进一步处理。如果您的表格包含行

<tr><td><IMG SRC="foo.png"></td></tr>

它将转换为HTML

<tr><td>&lt;IMG SRC=&quot;foo.png&quot;&gt;</td></tr>
你发现了

因为它是一个字符串,然后可以在将其写入文件之前进一步处理。如果后者(已转换)字符串存储在变量$imagelink中,则可以使用PowerShell -replace运算符:

$imagelink = $imagelink -replace "&lt;","<"

等等,用其对应的实际字符替换每个HTML字符实体。完成所有替换后,您只需将其写入Set-Content的文件。

答案 1 :(得分:0)

ConvertTo-Html cmdlet输出文本,因此,如果您知道要保留的图像路径,则可以在文本中搜索这些路径并在ConvertTo-Html将其编码为HTML后将其转换回来。考虑这个伪代码:

$HTML = $SQLdata | ConvertTo-Html -As Table
ForEach($ImageLink in $SQLdata.imagelinks){
    $EncodedLink = [System.Web.HttpUtility]::HtmlEncode($ImageLink)
    $HTML = $HTML -replace $EncodedLink, $ImageLink
}

首先,我从SQL数据生成HTML。然后我用图像(我称之为$SQLdata.imagelinks)遍历列,对于每个字符串,我将其编码为HTML(就像ConvertTo-Html cmdlet一样),这样我才知道我是什么我正在寻找。然后,我只需将编码字符串的任何实例替换为SQL数据中的原始实例。冲洗并重复,直到所有图像链接都替换回原始文本。

在HTML编码之后,使用<img src= "filepath to image folder" alt = "Cannot Find Image" height="100">字符串,您可以沉入其中的示例:

&lt;img src= &quot;filepath to image folder&quot; alt = &quot;Cannot Find Image&quot; height=&quot;100&quot;&gt;

所以在你的桌子的第一行你会看到:

<tr><td>Name</td><td>Redacted</td><td>AR</td><td>email</td><td>+41 61 681 85 25</td><td>&lt;img src= &quot;filepath to image folder&quot; alt = &quot;Cannot Find Image&quot; height=&quot;100&quot;&gt;</td></tr>

因此,我们可以运行一些简单的行来证明这是有效的:

$OriginalLink = '<img src= "filepath to image folder" alt = "Cannot Find Image" height="100">'
$EncodedLink = [System.Web.HttpUtility]::HtmlEncode($OriginalLink)
$BrokenHtml = '<tr><td>Name</td><td>Redacted</td><td>AR</td><td>email</td><td>+41 61 681 85 25</td><td>&lt;img src= &quot;filepath to image folder&quot; alt = &quot;Cannot Find Image&quot; height=&quot;100&quot;&gt;</td></tr>'
$BrokenHtml -replace $EncodedLink, $OriginalLink

现在技术上-replace使用RegEx(正则表达式)匹配,因此如果您在尝试匹配事物时遇到麻烦,或者获得无效的模式错误,您可以将编码链接转义为正则表达式友好,但我很漂亮确保HTML编码的过程应该使它相对正则表达式安全。如果您无法使用:

$HTML = $SQLdata | ConvertTo-Html -As Table
ForEach($ImageLink in $SQLdata.imagelinks){
    $EncodedLink = [System.Web.HttpUtility]::HtmlEncode($ImageLink)
    $RegexLink = [regex]::Escape($EncodedLink)
    $HTML = $HTML -replace $RegexLink, $ImageLink
}

编辑:我还将解释HTML,以及HTML特殊字符的使用。因此,将<导入ConvertTo-Html并接收&lt;的原因是小于符号是一个特殊字符。它保留用于定义HTML标记等内容。有许多字符具有这样的代码,大多数现代浏览器在将内容呈现给用户之前将转换为关联字符。您可以在此处查看列表:http://www.html.am/reference/html-special-characters.cfm

原因是ConvertTo-Html试图阻止您破坏它输出的HTML。当然,您的<img src...>行是有效的HTML,您知道,但cmdlet不是。假设您有一个表示Java < PowerShell的字符串,这是无效的HTML,因此为了安全起见,cmdlet只是查找任何保留字符并将它们转换为实体名称,这样您最终会得到可以安全呈现的文本并且不会破坏文档的HTML结构。