【问题标题】:Smart HTML encoding智能 HTML 编码
【发布时间】:2010-11-16 16:26:46
【问题描述】:

我正在寻找进行某种“智能”HTML 编码的最佳方式。 例如:

From: <a>Next >></a> to: <a>Next gt;gt;</a>
From: <p><a><b><< Prev</b></a><br/><a>Next >></a></p> to: <p><a><b>&lt;&lt; Prev</b></a><br/><a>Next gt;gt;</a></p>

所以只有文本的非 XML/HTML 部分会被编码,就像调用了 HtmlEncode 一样。

有什么建议吗?

编辑:这应该尽可能轻量级。传入的文本将来自不了解 HTML 编码的用户。

【问题讨论】:

  • Smart 将是“编写 HTML”或“编写纯文本”——尝试启发式地确定字符串的哪些部分是 HTML,哪些是使用在 HTML 中具有特殊含义的字符的文本是 hard(可能不可能做到 100% 的可靠性)。
  • 是的,我不是在寻找完美的解决方案。问题是用户可以选择插入一些带有 HTML 标签的文本。但它们用于插入不是 HTML 的内容,例如 >>。所以我必须尽量确保最终的内容是好的。很难向用户解释他们应该使用 >和 <而是。

标签: c# .net html xml encoding


【解决方案1】:

是的:不要永远将 HTML 写入源代码。而是使用像 DOM 这样的 API 来处理所有编码问题。

【讨论】:

  • 当然,如果该内容已经存在并且您无法更改生成器,那么您只能尝试自己操作该内容。您可能想尝试某种形式的词法解析。在任何情况下都不要尝试使用正则表达式。至少,如果您想保持理智,则不会。
【解决方案2】:

如果您想要一个可靠且完全可靠的 C# 解决方案(但重量级),那么我会使用 HTML Agility Pack library。然后,您可以遍历节点并对内容进行 HTML 编码。它比正则表达式更防弹,但显然更激烈。

如果您想在客户端执行此操作,请使用 JQuery。见Encode HTML entities with jQuery

【讨论】:

    【解决方案3】:

    您是否考虑过使用 tidy.net?您可以将您的用户输入投入其中,看看它会产生什么,它非常、非常、非常好,并将垃圾变成您真正想要的东西。我相信它是一个 DLL 和所有托管代码,因此您可以轻松地将其插入。

    至于 no to regexp band wagon,我不同意。如果数据是有限的(你没有说它是否是),那么你可以想出一些规则来至少尝试验证你输入的字符串,如果不清理它。我怀疑您的数据实际上可以是任何东西,在这种情况下您最好使用其他东西,但不应完全排除它。

    【讨论】:

      【解决方案4】:

      您可能正在尝试解决错误的问题。 (我知道这不是你想听到的。)

      如果允许用户将未编码的&gt;&gt;&lt;&lt; 写入HTML,那么他们大概也可以编写&lt;&gt;&lt;b&gt;,在这种情况下,您无法可靠地区分文本和标记。 (没关系,这会使您容易受到 XSS 攻击。)

      您确实必须在将文本插入 HTML 之前截取文本并对其进行编码。可能您应该解释导致您出现问题的工作流程。一定有更好的办法解决。

      编辑以回应评论:根本没有办法可靠地编码可以同时是文本或 HTML 的输入。无论如何,如果用户有足够的技术输入原始 HTML,大概他们能够编写实体 - 否则一开始就不应该输入原始 HTML。如果 HTML 输入仅适用于高级用户,那么您可以有一个复选框来指示输入是文本还是 HTML。但您可能应该考虑使用富文本编辑器。

      【讨论】:

      • 问题是我有一个功能请求,允许输入 HTML 标记来格式化文本。但以前文本总是被编码,用户习惯于将非 html 文本写入字段。现在我知道我会给出一些输入作为示例。为了防止它破坏 XML,我正在寻找一种“修复”它的方法。拦截输入不是一种选择,因为我无法控制它。
      • @Drejc:您可能应该将此信息添加到原始问题中。
      【解决方案5】:

      我可能会尝试为此编写一个好的正则表达式。您是在代码后面(C#)还是在客户端使用 JavaScript 执行此操作?

      http://www.regular-expressions.info/

      【讨论】:

      • 尝试使用正则表达式来解析非常规数据并不是解决这个问题的最佳方法。最好的方法是直接操作 DOM,这已经说明了。
      猜你喜欢
      • 2011-03-30
      • 1970-01-01
      • 2012-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-26
      • 2014-12-30
      相关资源
      最近更新 更多