Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Asp.net C#中编码html,但保留标记不变_C#_Html Encode - Fatal编程技术网

在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 &euro;!</p> 给我10万欧元 html标记必须保持完整可能使用string.replace只替换那些要编码的字符?您可以选择并编码标记的值除了htmlencode之外,还可以使用HtmlTextWriter。因此,您可以使用HtmlTextWriter设置,然后使用

我需要对整个文本进行编码,同时保留<和>

范例

<p>Give me 100.000 €!</p>
给我10万欧元

必须成为:

<p>Give me 100.000 &euro;!</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);
        }
    }
}