我需要对整个文本进行编码,同时保持 < 和 > 完整。
例子
<p>Give me 100.000 €!</p>
必须变成:
<p>Give me 100.000 €!</p>
html标签必须保持不变
我需要对整个文本进行编码,同时保持 < 和 > 完整。
例子
<p>Give me 100.000 €!</p>
必须变成:
<p>Give me 100.000 €!</p>
html标签必须保持不变
使用匹配标签或标签之间的内容的正则表达式,并编码之间的内容:
html = Regex.Replace(
html,
"(<[^>]+>|[^<]+)",
m => m.Value.StartsWith("<") ? m.Value : HttpUtility.HtmlEncode(m.Value)
);
您可能会选择Html Agility Pack,然后对标签的值进行编码
也许使用 string.replace 只是那些你想编码的字符?
除了 htmlencode 之外,您还可以使用 HtmlTextWriter。因此,您将使用 HtmlTextWriter 来设置您的<p></p>
,然后只需设置<p></p>
使用 HtmlEncode 的主体。HtmlTextWriter 允许 ToString(); 和一堆其他方法,所以它不应该是更多的代码。
正如其他人所建议的那样,这可以通过HtmlAgilityPack来实现。
public static class HtmlTextEncoder
{
public static string HtmlEncode(string html)
{
if (html == null) return null;
var doc = new HtmlDocument();
doc.LoadHtml(html);
EncodeNode(doc.DocumentNode);
doc.OptionWriteEmptyNodes = true;
using (var s = new MemoryStream())
{
doc.Save(s);
var encoded = doc.Encoding.GetString(s.ToArray());
return encoded;
}
}
private static void EncodeNode(HtmlNode node)
{
if (node.HasChildNodes)
{
foreach (var childNode in node.ChildNodes)
{
if (childNode.NodeType == HtmlNodeType.Text)
{
childNode.InnerHtml = HttpUtility.HtmlEncode(childNode.InnerHtml);
}
else
{
EncodeNode(childNode);
}
}
}
else if (node.NodeType == HtmlNodeType.Text)
{
node.InnerHtml = HttpUtility.HtmlEncode(node.InnerHtml);
}
}
}
这将遍历 HTML 中的所有节点,并将任何文本节点替换为 HTML 编码文本。
我创建了一个.NET fiddle 来演示这种技术。