在Asp.net C#中编码html,但保留标记不变
我需要对整个文本进行编码,同时保留<和> 范例在Asp.net C#中编码html,但保留标记不变,c#,html-encode,C#,Html Encode,我需要对整个文本进行编码,同时保留 范例 <p>Give me 100.000 €!</p> 给我10万欧元 必须成为: <p>Give me 100.000 €!</p> 给我10万欧元 html标记必须保持完整可能使用string.replace只替换那些要编码的字符?您可以选择并编码标记的值除了htmlencode之外,还可以使用HtmlTextWriter。因此,您可以使用HtmlTextWriter设置,然后使用
<p>Give me 100.000 €!</p>
给我10万欧元
必须成为:
<p>Give me 100.000 €!</p>
给我10万欧元
html标记必须保持完整可能使用string.replace只替换那些要编码的字符?您可以选择并编码标记的值除了htmlencode之外,还可以使用HtmlTextWriter。因此,您可以使用HtmlTextWriter设置
,然后使用HtmlEncode设置
的主体。HtmlTextWriter允许ToString();以及一系列其他方法,因此不应该有太多的代码。使用匹配标记或标记之间内容的正则表达式,并对标记之间的内容进行编码:
html = Regex.Replace(
html,
"(<[^>]+>|[^<]+)",
m => m.Value.StartsWith("<") ? m.Value : HttpUtility.HtmlEncode(m.Value)
);
html=Regex.Replace(
html,
“(]+>|[^正如其他人所建议的那样,这可以通过以下方法实现
这将遍历HTML中的所有节点,并用HTML编码的文本替换任何文本节点
我已经创建了一个。+1-我认为这解决了尝试使用replace或regex进行替换的大多数问题,而且可能比创建自己的要忽略的标记或要替换的字符的白名单要少。这必须是最好的方法。看起来OP正在尝试编码非ASCII实体(可能是为了避开字符集问题)。为此,最好是使用大于127的正则表达式匹配并替换为已知的实体名称。或者更好的是,如果这是根本问题,则解决字符集问题。:-)或者反过来。首先对所有内容进行编码,然后将en返回到<和>,您是否绝对需要对这些值进行编码,或者您可以将所有内容输出为unicode?如果您确实需要对文本进行编码,那么我可能会说您必须通过Html Agility Pack。但是请记住,如果您设置MIME类型正确。
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);
}
}
}